【JZOJ6434】【luoguP5665】【CSP-S2019】劃分

description



analysis

  • 首先有一個結論,對於[1,i][1,i]區間劃分最後一段的和儘量小,答案會更優,具體證明參考毛爺爺的博客

  • f[i]f[i]爲滿足[1,i][1,i]劃分最優時、(f[i],i](f[i],i]這段和最小時的最右的端點,最優劃分即爲從nn開始向ff不斷統計

  • 由後一段比前一段大可知sum[f[i]]sum[f[f[i]]]sum[i]sum[f[i]]sum[f[i]]-sum[f[f[i]]]≤sum[i]-sum[f[i]],即sum[i]2sum[f[i]]sum[f[f[i]]]sum[i]≥2sum[f[i]]-sum[f[f[i]]]

  • 右邊只和f[i]f[i]有關,把右邊的記爲clac(f[i])clac(f[i]),於是可以維護一個clacclac值上升的單調隊列來求出每一位的ff

  • 具體維護就是,隊頭不斷出隊直到sum[i]<clac(q[head])sum[i]<clac(q[head])(因爲f[i]f[i]要儘可能大),f[i]f[i]賦爲隊頭

  • clac(i)clac(q[tail])clac(i)≤clac(q[tail])隊尾再不斷出隊(因爲clac(i)clac(i)更小且ii更靠右),最後ii進隊,就完成了隊列的維護


code

#include<stdio.h>
#include<string.h>
#include<algorithm>
#define MAXN 40000005
#define ha 1073741824
#define ll long long
#define LL __int128
#define reg register int
#define fo(i,a,b) for (reg i=a;i<=b;++i)
#define fd(i,a,b) for (reg i=a;i>=b;--i)

using namespace std;

int p[100005],l[100005],r[100005];
int f[MAXN],q[MAXN];
ll b[MAXN],sum[MAXN];
int n,type;

inline int read()
{
	ll x=0,f=1;char ch=getchar();
	while (ch<'0' || '9'<ch){if (ch=='-')f=-1;ch=getchar();}
	while ('0'<=ch && ch<='9')x=x*10+ch-'0',ch=getchar();
	return x*f;
}
inline ll clac(ll x){return 2*sum[x]-sum[f[x]];}
inline void print(LL x)
{
	int num[55];num[0]=0;
	while (x)num[++num[0]]=x%10,x/=10;
	while (num[0])printf("%d",num[num[0]--]);
	printf("\n");
}
int main()
{ 
	n=read(),type=read();
	if (type)
	{
		int x=read(),y=read(),z=read();b[1]=read(),b[2]=read();int m=read(),now=1;
		fo(i,1,m)p[i]=read(),l[i]=read(),r[i]=read();
		fo(i,3,n)b[i]=(x*b[i-1]%ha+y*b[i-2]%ha+z)%ha;
		fo(i,1,n)
		{
			if (i>p[now])++now;
			sum[i]=sum[i-1]+(b[i]%(r[now]-l[now]+1))+l[now];
		}
	}
	else {fo(i,1,n)sum[i]=sum[i-1]+read();}
	int head=0,tail=0;
	fo(i,1,n)
	{
		while (head<tail && sum[i]>=clac(q[head+1]))++head;
		f[i]=q[head];
		while (head<tail && clac(i)<=clac(q[tail]))--tail;
		q[++tail]=i;
	}
	LL ans=0;
	for (reg i=n;i;i=f[i])ans+=(LL)(sum[i]-sum[f[i]])*(sum[i]-sum[f[i]]);
	print(ans);
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章