ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

征途

2022-02-06 09:32:48  阅读:174  来源: 互联网

标签:int wl wh 征途 getchar 写法 wr


link

决策单调性的另一种写法。似乎仍然可以使用斜率优化但我没去写

方程不重要,我的那个“方差一瞥”已经写得很清楚了,说一下决策单调性的第二种写法吧。这种写法适用于:

\[f[x]=\min\limits_{i=0}^{x-1}\{g(i)+w[i,x]\} \]

其中\(g(i)\)是一个与\(f[i]\)无关的函数。可以发现这个过程可以是离线的,毕竟先求谁再求谁对答案没有影响。于是就可以考虑分治。

用\(solve(wl,wr,l,r)\)来表示我们希望求区间[wl,wr]的答案,它们决策点的区间为[l,r]。我们可以考虑暴力求出\(\frac{wl+wr}{2}\)的答案,由于决策单调不减,那么[wl,mid-1]的决策点范围肯定是[l,k(mid)],右边同理。由于这种写法具有分治特性,它的复杂度大概是\(O(NlogN)\)(不知道会不会被卡哦)。

另外这种题目也要满足那个奇怪不等式才能生效。本题中你会发现它的w函数仍然是个开口朝上的二次函数,套用van具装箱的解释它也是满足条件的。

#include<cstdio>
#include<cstring>
//#define zczc
#define int long long
const int N=3010;
inline void read(int &wh){
    wh=0;int f=1;char w=getchar();
    while(w<'0'||w>'9'){if(w=='-')f=-1;w=getchar();}
    while(w<='9'&&w>='0'){wh=wh*10+w-'0';w=getchar();}
    wh*=f;return;
}

int m,n,a[N],s[N],f[N][N];
void solve(int x,int wl,int wr,int l,int r){
	if(wl>wr)return;
	int mid=wl+wr>>1,pl;
	for(int i=l;i<=r&&i<=mid;i++){
		int now=f[x-1][i]+(s[mid]-s[i])*(s[mid]-s[i]);
		if(now<f[x][mid])f[x][mid]=now,pl=i;
	}
	solve(x,wl,mid-1,l,pl);
	solve(x,mid+1,wr,pl,r);
}

signed main(){
	
	#ifdef zczc
	freopen("in.txt","r",stdin);
	#endif
	
	read(m);read(n);memset(f,0x3f,sizeof(f));
	for(int i=1;i<=m;i++)read(a[i]),s[i]=s[i-1]+a[i];
	for(int i=1;i<=m;i++)f[1][i]=s[i]*s[i];
	for(int i=2;i<=n;i++)solve(i,1,m,0,m-1);
	printf("%lld",-s[m]*s[m]+n*f[n][m]);
	
	return 0;
}

标签:int,wl,wh,征途,getchar,写法,wr
来源: https://www.cnblogs.com/dai-se-can-tian/p/15865265.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有