求助玄学错误
查看原帖
求助玄学错误
65190
_LanFeng_楼主2021/10/2 20:19

RT,见代码注释。请问是为什么?

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=4e7+10,mod=(1<<30);
int n;
bool type;
struct Node
{
	int pos;
	ll val;
}temp,q[N];
int a,b[4],l,r,p,pre[N];
ll sum[N];
int read()
{
    int x=0,f=1;char s=getchar();
    while(s<'0'||s>'9'){if(s=='-')f=-f;s=getchar();}
    while(s>='0'&&s<='9'){x=x*10+s-48;s=getchar();}
    return x*f;
}
void write(__int128 x)
{
	if(!x) return;
	write(x/10);
	putchar(x%10+'0');
}
int main() 
{
	n=read(),type=read();
	if(!type) 
	for(int i=1;i<=n;i++)
	{
		a=read();
		sum[i]=sum[i-1]+a; 
	}
	else 
	{
		int x,y,z,m;
		x=read(),y=read(),z=read(),b[1]=read(),b[2]=read(),m=read();
		p=read(),l=read(),r=read(); 
		for(int i=1;i<=2;i++)
		{
		    a=(b[i]%(r-l+1))+l;
		    sum[i]=sum[i-1]+a;
		    if(p==i) //scanf("%d%d%d",&p,&l,&r);
		    p=read(),l=read(),r=read();
            //这个位置如果用读优,那么样例三就会超时,用scanf就不会
		}
		for(int i=3;i<=n;i++)
		{
			b[3]=(ll)((ll)x*b[2]%mod+(ll)y*b[1]%mod+z)%mod;
			a=(b[3]%(r-l+1))+l;
			if(i==p) //scanf("%d%d%d",&p,&l,&r);
			p=read(),l=read(),r=read();
			b[1]=b[2],b[2]=b[3];
			sum[i]=sum[i-1]+a;
		} 
	} 
	for(int i=1,last=0,l=1,r=0;i<=n;i++)
	{
		while(l<=r&&q[l].val<=sum[i])
		{
			last=q[l].pos;
			l++;
		}
		pre[i]=last;
		temp.pos=i,temp.val=sum[i]+sum[i]-sum[last];
		while(l<=r&&q[r].val>=temp.val) r--;
		q[++r]=temp;
	} 
	__int128 ans=0;
	int now=n;
	while(now)
	{
	    ans+=(__int128)(sum[now]-sum[pre[now]])*(sum[now]-sum[pre[now]]);
	    now=pre[now];
	}
	write(ans);
	return 0;
}
2021/10/2 20:19
加载中...