求助大佬!!!蒟蒻调了一上午也没过去
查看原帖
求助大佬!!!蒟蒻调了一上午也没过去
267428
Access57楼主2022/8/3 11:46
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int MAXN=100010,plus=0,mul=1;
int a[MAXN],b[4*MAXN],m[4*MAXN],tree[4*MAXN],Mod=531373,n,k;
inline int lc(int node) {return node<<1;}
inline int rc(int node) {return node<<1|1;}
void build(int l,int r,int p)
{
	if(l==r) {tree[p]=a[l]%Mod;return;}
	int m=l+((r-l)>>1);
	build(l,m,lc(p)),build(m+1,r,rc(p));
	tree[p]=(tree[lc(p)]+tree[rc(p)])%Mod;
}
inline void push_down(int p,int s,int t)
{
	
	if(m[p]!=1&&m[p])
	{
		tree[lc(p)]*=m[p],tree[lc(p)]%=Mod,tree[rc(p)]*=m[p],tree[rc(p)]%=Mod;
		m[lc(p)]*=m[p],m[rc(p)]*=m[p],m[lc(p)]%=Mod,m[rc(p)]%=Mod;
		//b[lc(p)]*=b[p],b[rc(p)]*=b[p],b[lc(p)]%=Mod,b[rc(p)]%=Mod;
	}
	
	int mid=s+((t-s)>>1);
	b[p]*=m[p],m[p]=1;
	tree[lc(p)]+=b[p]*(mid-s+1),tree[lc(p)]%=Mod,tree[rc(p)]+=b[p]*(t-mid),tree[rc(p)]%=Mod;
	b[lc(p)]+=b[p],b[rc(p)]+=b[p],b[lc(p)]%=Mod,b[rc(p)]%=Mod;
	b[p]=0;
	
	return;
}
int getsum(int l,int r,int s,int t,int p)//getsum(l,r,1,n,1);
{
	if(l<=s&&r>=t) return tree[p];
	int m=s+((t-s)>>1),sum=0;
	push_down(p,s,t);
	if(l<=m) sum+=getsum(l,r,s,m,lc(p))%Mod;
	if(r>m) sum+=getsum(l,r,m+1,t,rc(p))%Mod;//r>=m+1
	return sum%Mod;
}
void update(int l,int r,int c,int s,int t,int p)
{
	if(l<=s&&r>=t) 
	{
		tree[p]+=(t-s+1)*c,b[p]+=c;
		tree[p]%=Mod,b[p]%=Mod;
		
		return;
	}
	int m=s+((t-s)>>1);
	push_down(p,s,t);
	if(l<=m) update(l,r,c,s,m,lc(p));
	if(r>m) update(l,r,c,m+1,t,rc(p));
	tree[p]=(tree[lc(p)]+tree[rc(p)])%Mod;
}
void update_mul(int l,int r,int c,int s,int t,int p)
{
	b[p]*=c;
	if(l<=s&&r>=t) 
	{
		if(m[p]==0) m[p]=1;
		tree[p]*=c,m[p]*=c,m[p]%=Mod,tree[p]%=Mod;
		return;
	}
	
	int mid=s+((t-s)>>1);
	
	push_down(p,s,t);
	
	if(l<=mid) update_mul(l,r,c,s,mid,lc(p));
	if(r>mid) update_mul(l,r,c,mid+1,t,rc(p));
	tree[p]=(tree[lc(p)]+tree[rc(p)])%Mod;
}
inline void ptre()
{
	cout<<"\n";
	for(int i=0;i<20;i++) cout<<tree[i]<<" ";
	cout<<"\n";
}
void printlist()
{
	for(int i=0;i<n;i++) cout<<getsum(i,i,1,n,1)<<" ";
	cout<<"\n";
}
signed main()
{
	//freopen("P3373_1.in","r",stdin);
	for(int i=0;i<4*MAXN-10;i++) m[i]=1;
	cin>>n>>k>>Mod;
	for(int i=1;i<=n;i++) cin>>a[i],a[i]%=Mod;
	build(1,n,1);
	ptre();//printlist();
	for(int i=0;i<k;i++)
	{
		int q,b,c,d;
		cin>>q;
		if(q==1) cin>>b>>c>>d,update_mul(b,c,d,1,n,1),cout<<"\nmul:["<<b<<","<<c<<"] *"<<d<<"\ntree:",ptre();//,cout<<"list:",printlist();
		if(q==2) cin>>b>>c>>d,update(b,c,d,1,n,1),cout<<"\nplus:["<<b<<","<<c<<"] +"<<d<<"\ntree:",ptre();//,cout<<"list:",printlist();
		if(q==3) cin>>b>>c,cout<<"\nsum:["<<b<<","<<c<<"]:"<<getsum(b,c,1,n,1)%Mod<<"\n";
	}
	
}
2022/8/3 11:46
加载中...