悬赏永久双关注
查看原帖
悬赏永久双关注
315205
Kniqht楼主2023/11/6 20:24

rt,求调88pts,数组开大后还CE了,求说说该怎么改

另外我这个type=1的读入好像也有点问题,而且调了好久都看不出来,破防

拜谢大佬

#include<bits/stdc++.h>
#define int long long
#define ll long long
using namespace std;
const int N=4e7+10;
const int P=1ll<<30;
int n,typ;
int a[N],b[N],sum[N];
__int128 f[N],last[N];
int q[N];
void write(__int128 x){
    if(x>9) write(x/10);
    putchar(x%10+'0');
}
signed main(){
	scanf("%lld%lld",&n,&typ);
	if(!typ){
		for(int i=1;i<=n;i++) scanf("%lld",&a[i]),sum[i]=sum[i-1]+a[i];
	}
	else{
		int x,y,z,m,l,r,p,last=0;
		scanf("%lld%lld%lld%lld%lld%lld",&x,&y,&z,&b[1],&b[2],&m);
		for(int i=3;i<=n;i++) b[i]=(x*b[i-1]%P+y*b[i-2]%P+z%P)%P;
		for(int j=1;j<=m;j++){
			scanf("%lld%lld%lld",&p,&l,&r);
			for(int i=last+1;i<=p;i++) a[i]=(b[i]%(r-l+1))+l,sum[i]=sum[i-1]+a[i];
			last=p;
		}
	}
	int hh=0,tt=0;
	for(int i=1;i<=n;i++){
		while(hh<tt&&last[q[hh+1]]+sum[q[hh+1]]<=sum[i]) hh++;
		last[i]=sum[i]-sum[q[hh]];
		f[i]=f[q[hh]]+last[i]*last[i];
		while(hh<tt&&last[q[tt]]+sum[q[tt]]>=last[i]+sum[i]) tt--;
		q[++tt]=i;
//		for(int j=0;j<i;j++)
//			if(last[j]<=sum[i]-sum[j]) f[i]=f[j]+(sum[i]-sum[j])*(sum[i]-sum[j]),last[i]=sum[i]-sum[j];
	}
	
    write(f[n]);
	return 0;
}
2023/11/6 20:24
加载中...