30pts qz
查看原帖
30pts qz
702659
l0k9j8h7楼主2024/10/13 10:22
#include<iostream>
#include<cstring>
using namespace std;
#define max_size 4000005
#define mod 571373
#define ll long long
ll ans[max_size],a[max_size],tag[max_size],tag2[max_size];
#define lp p<<1
#define rp p<<1|1/*乘2+1*/
#define mid ((l+r)>>1)

void build(int l,int r,int p){
	if(l==r)ans[p]=a[l];
	else {
		build(l,mid,lp);
		build(mid+1,r,rp);
		ans[p]=(ans[lp]+ans[rp])%mod;
	}
	
}

inline void push_down(int p,int l,int r){
	tag2[lp]=tag2[lp]%mod*tag2[p]%mod;
	tag2[rp]=tag2[rp]%mod*tag2[p]%mod;
	ans[lp]=ans[lp]%mod*tag2[p]%mod;
	ans[rp]=ans[rp]%mod*tag2[p]%mod;
	tag2[p]=1;
	ans[lp]%=mod;
	ans[rp]%=mod;

	tag[lp]+=tag[p];
	tag[rp]+=tag[p];
	ans[lp]+=tag[p]%mod*(mid-l+1)%mod;
	ans[rp]+=tag[p]%mod*(r-mid)%mod;
	tag[p]=0;//标记下传
	ans[lp]%=mod;
	ans[rp]%=mod;
}
inline void push_up(int p){
	ans[p]=ans[lp]+ans[rp];
	ans[p]%=mod;
}
inline void update(int nl,int nr,int l,int r,int p,int k){
	if(nl<=l&&nr>=r/*区间被叶子包含*/){
		ans[p]+=(r-l+1)*k;
		ans[p]%=mod;
		tag[p]+=k;
		tag[p]%=mod;
		return;
	}push_down(p,l,r);
	if(nl<=mid)update(nl,nr,l,mid,lp,k);
	if(nr>mid)update(nl,nr,mid+1,r,rp,k);
	push_up(p);
}
inline void update2(int nl,int nr,int l,int r,int p,int k){
	if(nl<=l&&nr>=r/*区间被叶子包含*/){
		ans[p]*=k;
		tag2[p]*=k;
		tag[p]*=k;
		tag[p]%=mod;/*乘法标记更新时加法标记也要更新*/
		tag2[p]%=mod;
		ans[p]%=mod;
		return;
	}push_down(p,l,r);
	if(nl<=mid)update2(nl,nr,l,mid,lp,k);
	if(nr>mid)update2(nl,nr,mid+1,r,rp,k);
	push_up(p);
}
ll query(int ql,int qr,int l,int r,int p){
	if(ql<=l&&qr>=r){
		return ans[p]%mod;
	}ll res=0;
	push_down(p,l,r);/*区间拆分要下传标记*/
	if(ql<=mid)res+=query(ql,qr,l,mid,lp)%mod;
	if(qr>mid)res+=query(ql,qr,mid+1,r,rp)%mod;
	return res%mod;
}int main(){
	int c,d,i;
	cin>>c>>d>>i;
	for(int i=0;i<max_size;i++)tag2[i]=1;/*乘法标记初始化*/
	for(int i=1;i<=c;i++){
		cin>>a[i];
	}build(1,c,1);
	for(int i=1;i<=d;i++){
		int t;
		cin>>t;
		switch (t) {
		case 1:
			ll x,y,k;
			cin>>x>>y>>k;
			update2(x,y,1,c,1,k%mod);
			break;
		case 2:
			cin>>x>>y>>k;
			update(x,y,1,c,1,k%mod);
			break;
		case 3:
			cin>>x>>y;
			cout<<query(x,y,1,c,1)%mod<<endl;
			break;
	
		}
	}
}

只过了#1 #3 #4

2024/10/13 10:22
加载中...