P3373 线段树求助!
  • 板块学术版
  • 楼主lgx57
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/5/27 21:41
  • 上次更新2024/5/28 12:27:07
查看原帖
P3373 线段树求助!
1053695
lgx57楼主2024/5/27 21:41

感觉 push_down 写错了。

#include<bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
void fio(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
}
int ls(int x){
	return x<<1;
}
int rs(int x){
	return x<<1|1;
}
int n,m;
const int N=1e5+5;
int mod;
int a[N],tree[N<<2],tag1[N<<2],tag2[N<<2];
void push_up(int p){
	tree[p]=(tree[ls(p)]+tree[rs(p)])%mod;
}
void build(int p,int pl,int pr){
	tag1[p]=0;
	tag2[p]=1;
	if (pl==pr){
		tree[p]=a[pl];
		return ;
	}
	int mid=(pl+pr)>>1;
	build(ls(p),pl,mid);
	build(rs(p),mid+1,pr);
	push_up(p);
}
void addtag1(int p,int pl,int pr,int d){
	tag1[p]+=d;
	tag1[p]%=mod;
	tree[p]+=d*(pr-pl+1);
	tree[p]%=mod;
}
void addtag2(int p,int pl,int pr,int d){
	tag1[p]*=d;
	tag1[p]%=mod;
	tag2[p]*=d;
	tag2[p]%=mod;
	tree[p]*=d;
	tree[p]%=mod;
}
void push_down(int p,int pl,int pr){
	int mid=(pl+pr)>>1;
	addtag2(ls(p),pl,mid,tag2[p]%mod);
	addtag2(rs(p),mid+1,pr,tag2[p]%mod);
	addtag1(ls(p),pl,mid,tag1[p]*tag2[p]%mod);
	addtag1(rs(p),mid+1,pr,tag1[p]*tag2[p]%mod);
	tag1[p]=0;
	tag2[p]=1;
}
void update1(int l,int r,int p,int pl,int pr,int d){
	if (l<=pl&&pr<=r){
		addtag1(p,pl,pr,d);
		return ;
	}
	push_down(p,pl,pr);
	push_up(p);
	int mid=(pl+pr)>>1;
	if (l<=mid){
		update1(l,r,ls(p),pl,mid,d);
	}
	if (r>mid){
		update1(l,r,rs(p),mid+1,pr,d);
	}
	push_up(p);
}
void update2(int l,int r,int p,int pl,int pr,int d){
	if (l<=pl&&pr<=r){
		addtag2(p,pl,pr,d);
		return ;
	}
	push_down(p,pl,pr);
	push_up(p);
	int mid=(pl+pr)>>1;
	if (l<=mid){
		update2(l,r,ls(p),pl,mid,d);
	}
	if (r>mid){
		update2(l,r,rs(p),mid+1,pr,d);
	}
	push_up(p);
}
int query(int l,int r,int p,int pl,int pr){
	if (l<=pl&&pr<=r){
		return tree[p];
	}
	push_down(p,pl,pr);
	int ans=0;
	int mid=(pl+pr)>>1;
	if (l<=mid){
		ans+=query(l,r,ls(p),pl,mid);
		ans%=mod;
	}
	if (r>mid){
		ans+=query(l,r,rs(p),mid+1,pr);
		ans%=mod;
	}
	return ans;
}
signed main(){
	fio();
	cin>>n>>m>>mod;
	for (int i=1;i<=n;i++){
		cin>>a[i];
	}
	build(1,1,n);
	while (m--){
		int opt;
		cin>>opt;
		int x,y,k;
		if (opt==1){
			cin>>x>>y>>k;
			update2(x,y,1,1,n,k);
		}
		else if(opt==2){
			cin>>x>>y>>k;
			update1(x,y,1,1,n,k);
		}
		else{
			cin>>x>>y;
			cout<<query(x,y,1,1,n)<<endl;
		}
	}
	return 0;
}

2024/5/27 21:41
加载中...