萌新92分求助卡空间
查看原帖
萌新92分求助卡空间
196899
lndjy楼主2020/8/21 06:59

RT,23过了(1022MB卡过去的),2425MLE了

#include<iostream> 
#include<cstdio>
#define ll __int128
using namespace std;
int inline read()
{
	int ans=0,f=1;
	char ch=getchar();
	while(!isdigit(ch))
	{
		if(ch=='-')
		f=-1;
		ch=getchar();
	}
	while(isdigit(ch))
	{
		ans=ans*10+ch-'0';
		ch=getchar();
	}
	return ans*f;
}
void write(ll x)
{
	if(x/10)
	write(x/10);
	putchar((x%10)+'0');
}
const int mod=1<<30,N=4e7+5,M=1e5+5;
ll s[N];
int p[M],l[M],r[M],b[N],f[N];
int n,m,x,y,z,op,h,t;
void get0()
{
	for(int i=1;i<=n;i++) s[i]=s[i-1]+read();
}
void get1()
{
	x=read(),y=read(),z=read(),b[1]=read(),b[2]=read(),m=read();
	for(int i=1;i<=m;i++)
	p[i]=read(),l[i]=read(),r[i]=read();
	for(int i=3;i<=n;i++)
	b[i]=((1ll*x*b[i-1]+1ll*y*b[i-2])%mod+z)%mod;
	for(int j=1;j<=m;j++)
	for(int i=p[j-1]+1;i<=p[j];i++)
	s[i]=s[i-1]+(b[i]%(r[j]-l[j]+1)+l[j]);
}
ll val(int x){return s[x]*2-s[f[x]];}
int q[N];
int main()
{
	n=read();op=read();
	if(op==0) get0();
	else get1();
	h=1,t=1;
	q[t]=0;
	for(int i=1;i<=n;i++)
	{
		while(h<t&&val(q[h+1])<=s[i]) h++;
		f[i]=q[h];
		while(h<=t&&val(q[t])>=val(i)) t--;
		q[++t]=i;
	}
	ll ans=0;
	for(int i=n;i;i=f[i])
	ans+=(s[i]-s[f[i]])*(s[i]-s[f[i]]);
	write(ans);
	return 0;
}
2020/8/21 06:59
加载中...