CE求助
查看原帖
CE求助
279095
gargantuar楼主2023/10/24 02:09

代码如下

#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<queue>
using namespace std;
inline int read() {
	register char a;
	register int x=0;
	a=getchar();
	while(a<48||a>57) {
		a=getchar();
		//printf("r");
	}
	while(a>=48&&a<=57) {
		x=x*10+a-48;
		a=getchar();
	}
	return x;
}
long long arr[40000004],ans,mark=0,x,y,z,tl=0;
int n,m,dp[40000004],m3[40000004]= {0,1};
bool typ;
int main() {
	n=read();
	typ=read();
	arr[0]=dp[0]=0;
	if(!typ) {
		for(int i=1; i<=n; ++i) {
			arr[i]=read();
			arr[i]+=arr[i-1];
		}
	} else {
		int p=0,p0=0,l,r;
		int md=pow(2,30);
		x=read();
		y=read();
		z=read();
		dp[1]=read();
		dp[2]=read();
		m=read();
		for(int i=3; i<=n; ++i) {
			dp[i]=x*dp[i-1]+dp[i-2]+z;
			dp[i]%=md;
		}
		for(int i=0; i<m; ++i) {
			p0=p;
			p=read(),l=read(),r=read();
			for(int j=p0+1; j<=p; ++j) {
				arr[j]=dp[i]%(r-l+1)+l;
				arr[j]+=arr[j-1];
			}
		}
	}
	
	arr[0]=dp[0]=0;
	for(int i=1; i<=n; ++i) {
		while(arr[i]-arr[m3[mark]]>=arr[m3[mark]]-arr[dp[m3[mark]]]&&mark<=tl) {
			++mark;
		}
		dp[i]=m3[--mark];
		while(arr[i]-arr[dp[i]]+arr[i]-arr[m3[tl]]<=arr[m3[tl]]-arr[dp[m3[tl]]])--tl;
		m3[++tl]=i;
	}
	ans=0;
	for(int a=n; a>0;) {
		ans+=(arr[a]-arr[dp[a]])*(arr[a]-arr[dp[a]]);
		a=dp[a];
	}
	cout<<ans;
	return 0;
}
2023/10/24 02:09
加载中...