社区讨论

代码求调

学术版参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@lqbxc5gu
此快照首次捕获于
2023/12/19 13:48
2 年前
此快照最后确认于
2023/12/19 17:58
2 年前
查看原帖

大佬求调

这是我原来的代码
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=4e5+5;
int tr[N],tg1[N],n,m,p,tg2[N];
void pushup(int u){
	tr[u]=(tr[u<<1]+tr[u<<1|1])%p;
}
void build(int u,int l,int r){
	tg1[u]=1;
	if(l==r){
		cin>>tr[u];
		return ;
	}
	int mid=(l+r)>>1;
	build(u<<1,l,mid);
	build(u<<1|1,mid+1,r);
	pushup(u);
}
void pushdown(int u,int l,int r){
	int &x=tg1[u],&y=tg2[u];
	if(x==1&&!y)return ;
	tg1[u*2]=(tg1[u*2]*x)%p;
	tg1[u*2+1]=(tg1[u*2+1]*x)%p;
	tg2[u*2]=(tg2[u*2]*x+y)%p;
	tg2[u*2+1]=(tg2[u*2+1]*x+y)%p;
	int mid=(l+r)>>1;
	tr[u*2]=(tr[u*2]*x+(mid-l+1)*y)%p;
	tr[u*2+1]=(tr[u*2+1]*x+(r-mid)*y)%p;
	x=1;
	y=0;
}
void modify(int u,int l,int r,int a,int b,int x,int y){
	if(a<=l&&b>=r){
		tg1[u]=(tg1[u]*x)%p;
		tg2[u]=(tg2[u]*x+y)%p;
		tr[u]=(tr[u]*x+(r-l+1)*y)%p;
		return ;
	}
	int mid=(l+r)>>1;
	pushdown(u,l,r);
	if(a<=mid)modify(u*2,l,mid,a,b,x,y);
	if(b>mid)modify(u*2+1,mid+1,r,a,b,x,y);
	pushup(u);		
}
int query(int u,int r,int l,int a,int b){
	if(a<=l&&r<=b)return tr[u];
	pushdown(u,l,r);
	int s=0,mid=(l+r)>>1;
	if(a<=mid)s=query(u*2,l,mid,a,b);
	if(b>mid)s+=query(u*2+1,mid+1,r,a,b);
	return s%p;
}
signed main(){
	cin.tie(0)->sync_with_stdio(0);
	cin>>n>>m>>p;
	build(1,1,n);
	for(int w,a,b,c;m--;){
		cin>>w>>a>>b;
		if(w==1) cin>>c,modify(1,1,n,a,b,c,0);
		else if(w==2)cin>>c,modify(1,1,n,a,b,1,c);
		else cout<<query(1,1,n,a,b)<<endl;
	}
	return 0;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...