题解:P5665 [CSP-S2019] 划分
wallace_QwQ · · 题解
因为
令
若
所以最后一段要尽可能的小。
设
那么对于
两边同时加
由于
对于任意的
所以单调队列里的元素一定是根据
每个元素最多分别进出单调队列一次,时间复杂度
int n; bool ty;
ULL pre[N];
__int128 ans;
int b[N],p[M],l[M],r[M];
int q[N],g[N];
LL calc(int p){return 2*pre[p]-pre[g[p]-1];}
void solve(){
cin>>n>>ty;
if(!ty){
ULL a;
for1(i,1,n) {rin(a); pre[i]=pre[i-1]+a;}
}else{
int x,y,z,m;
cin>>x>>y>>z>>b[1]>>b[2]>>m;
for1(i,1,m) cin>>p[i]>>l[i]>>r[i];
for1(i,3,n) b[i]=(1ll*b[i-1]*x+1ll*b[i-2]*y+z)%mod;
for1(i,1,m)
for1(j,p[i-1]+1,p[i])
pre[j]=pre[j-1]+b[j]%(r[i]-l[i]+1)+l[i];
}
int h=1,t=1;
for1(i,1,n){
while(pre[i]>=calc(q[h+1])&&h<t) h++;
g[i]=q[h]+1;
while(calc(i)<=calc(q[t])&&h<=t) t--;
q[++t]=i;
}
int pos=n;
while(pos){
__int128 qwq=pre[pos]-pre[g[pos]-1];
ans+=qwq*qwq;
pos=g[pos]-1;
}
rout(ans);
return ;
}