怎么优化高精常数
查看原帖
怎么优化高精常数
327657
Origins楼主2022/2/8 22:15

RT,TLE#24#25,自闭了......

#include<cstdio>
#include<cstring>
#include<iostream> 
#define ll long long
const int maxn=4e7+10;
const ll INF=0x3f3f3f3f3f3f3f3f; 
int read(){
	int sum=0,sg=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')sg=-1;ch=getchar();}
	while(ch>='0'&&ch<='9')sum=(sum<<1)+(sum<<3)+ch-'0',ch=getchar();
	return sum*sg;
}
int n,ty,que[maxn],hd,tl,pos[maxn];
ll sum[maxn];
ll qval(int x){return sum[x]+sum[x]-sum[pos[x]];}
struct BigInt{
	static const int L=9;
	static const int mod=1e9;
	ll s[15],len;
	BigInt(){len=1,memset(s,0,sizeof(s));}
	BigInt(ll num){
		if(!num)len=1,memset(s,0,sizeof(s));
		else{
			len=0,memset(s,0,sizeof(s));
			while(num)s[++len]=num%mod,num/=mod;
		}
	}
	BigInt operator * (const BigInt& b)const{
		BigInt c;
		for(int i=1;i<=len;i++){
			for(int j=1;j<=b.len;j++){
				c.s[i+j-1]+=s[i]*b.s[j];
				c.s[i+j]+=c.s[i+j-1]/mod;
				c.s[i+j-1]%=mod;
			}
		}
		c.len=len+b.len+1;
		while(c.len>1&&!c.s[c.len])c.len--;
		return c;
	}
	BigInt operator + (const BigInt& b)const{
		BigInt c;
		c.len=std::max(len,b.len);
		for(int i=1;i<=c.len;i++){
			c.s[i]+=s[i]+b.s[i];
			c.s[i+1]+=c.s[i]/mod;
			c.s[i]%=mod;
		}
		c.len++;
		while(c.len>1&&!c.s[c.len])c.len--;
		return c;
	}
	void write(){
		printf("%lld",s[len]);
		for(int i=len-1;i;i--)
			printf("%.9lld",s[i]);
		puts("");	
	}
};
BigInt ans;
int main(){
	n=read(),ty=read();
	if(!ty) 
		for(int i=1,a;i<=n;i++)a=read(),sum[i]=sum[i-1]+a;
	else{
		ll x=read(),y=read(),z=read(),b1=read(),b2=read(),b3=0,m=read();
		int now=1,lstp=0;
		for(int i=1;i<=m;i++){
			int p=read(),l=read(),r=read();
			for(;now>lstp&&now<=p;now++){
				if(now==1)sum[now]=sum[now-1]+b1%(r-l+1)+l;
				else if(now==2)sum[now]=sum[now-1]+b2%(r-l+1)+l;
				else{
					b3=(x*b2+y*b1+z)&((1<<30)-1);
					sum[now]=sum[now-1]+b3%(r-l+1)+l;
					b1=b2,b2=b3;
				}
			}
			lstp=p;
		}
	}
	hd=1,tl=0,pos[0]=0,que[++tl]=0;	
	for(int i=1;i<=n;i++){
		while(hd+1<=tl&&qval(que[hd+1])<=sum[i])hd++;
		pos[i]=que[hd];
		while(hd<=tl&&qval(que[tl])>=qval(i))tl--;
		que[++tl]=i;
	}
	for(int i=n;i;i=pos[i])
		ans=BigInt(sum[i]-sum[pos[i]])*BigInt(sum[i]-sum[pos[i]])+ans;
	ans.write();
	return 0;
}
2022/2/8 22:15
加载中...