TLE 70pts 我萌了
查看原帖
TLE 70pts 我萌了
383791
Others楼主2021/6/25 21:33

还有什么优化?

#include <bits/stdc++.h>
#define ll long long 
using namespace std;
int n,q,mod;
ll a[100086],rp[270086],b[270086],c[270086]; 
void build(int l,int r,int p){
	c[p]=1;
	if(l==r) {rp[p]=a[l];/**/return;}
	int mid=l+r>>1;
	build(l,mid,(p<<1)),build(mid+1,r,(p<<1)+1);
	rp[p]=(rp[(p<<1)]+rp[(p<<1)+1])%mod;
}
void cd(int p,int l,int r){
	int mid=l+r>>1;
	c[(p<<1)]=(c[(p<<1)]*c[p])%mod;
	c[(p<<1)+1]=(c[(p<<1)+1]*c[p]%mod);
	b[(p<<1)]=(b[(p<<1)]*c[p]+b[p])%mod;
	b[(p<<1)+1]=(b[(p<<1)+1]*c[p]+b[p])%mod;
	rp[(p<<1)]=(rp[(p<<1)]*c[p]+b[p]*(mid-l+1))%mod;
	rp[(p<<1)+1]=(rp[(p<<1)+1]*c[p]+b[p]*(r-mid))%mod;
	c[p]=1;
	b[p]=0;
	return;
}
void add(int l,int r,int s,int t,int p,ll x){//[s,t]+x
	if(s<=l&&t>=r) {b[p]=(b[p]+x)%mod,rp[p]=(rp[p]+x*(r-l+1))%mod;/**/return;}
	cd(p,l,r);
	int mid=l+r>>1;
	if(s<=mid) add(l,mid,s,t,(p<<1),x);
	if(t>mid) add(mid+1,r,s,t,(p<<1)+1,x);
	rp[p]=(rp[(p<<1)]+rp[((p<<1))+1])%mod;
}
void mul(int l,int r,int s,int t,int p,ll x){//[s,t]*x
	if(l==r){rp[p]=rp[p]*x%mod,c[p]=c[p]*x%mod,b[p]=b[p]*x%mod;/**/return;}
	cd(p,l,r);
	int mid=l+r>>1;
	if(s<=mid) mul(l,mid,s,t,(p<<1),x);
	if(t>mid) mul(mid+1,r,s,t,(p<<1)+1,x);
	rp[p]=(rp[(p<<1)]+rp[(p<<1)+1])%mod;
}
ll getsum(int l,int r,int s,int t,int p){//sum[s,t]
	if(s<=l&&t>=r) return rp[p];
	int mid=l+r>>1;
	cd(p,l,r);
	ll tot=0;
	if(s<=mid) tot+=getsum(l,mid,s,t,(p<<1));
	if(t>mid) tot+=getsum(mid+1,r,s,t,(p<<1)+1);
	return tot%mod;
}
int main() {
	scanf("%d%d%d",&n,&q,&mod);
	for(int i=1;i<=n;++i){
		scanf("%lld",&a[i]);
	}
	build(1,n,1);
	int c,l,r;
	ll x;
	for(int i=1;i<=q;++i){
		scanf("%d",&c);
		if(c==2){scanf("%d%d%lld",&l,&r,&x);/**/add(1,n,l,r,1,x);}
		else if(c==1){scanf("%d%d%lld",&l,&r,&x);/**/mul(1,n,l,r,1,x);}
		else{scanf("%d%d",&l,&r);/**/printf("%lld\n",getsum(1,n,l,r,1)%mod);}
	}
	return 0;
} 
2021/6/25 21:33
加载中...