进食后人
查看原帖
进食后人
1710362
Jomo1203楼主2025/7/29 15:59

看程序找问题:

伪人代码

#include<iostream>
using namespace std;
const int maxn=1e5+1;
int n,q,m;
long long a[maxn];
#define lp p<<1
#define rp p<<1|1
struct SegTree{
	struct node{
		int l,r;
		long long plz,mlz,val;
	}tr[maxn<<2];
	void pushdown(int p){
		tr[lp].val=(tr[lp].val*tr[p].mlz)%m;
		tr[rp].val=(tr[rp].val*tr[p].mlz)%m;
		tr[lp].mlz=(tr[lp].mlz*tr[p].mlz)%m;
		tr[rp].mlz=(tr[rp].mlz*tr[p].mlz)%m;
		tr[lp].plz=(tr[lp].plz*tr[p].mlz)%m;
		tr[rp].plz=(tr[rp].plz*tr[p].mlz)%m;
		
		tr[lp].val=(tr[lp].val+tr[p].plz*(tr[lp].r-tr[lp].l+1))%m;
		tr[rp].val=(tr[rp].val+tr[p].plz*(tr[rp].r-tr[rp].l+1))%m;
		tr[lp].plz=(tr[lp].plz+tr[p].plz)%m;
		tr[rp].plz=(tr[rp].plz+tr[p].plz)%m;
		
		tr[p].mlz=1;
		tr[p].plz=0;
	}
	void build(int p,int l,int r){
		tr[p].l=l;
		tr[p].r=r;
		tr[p].plz=0;
		tr[p].mlz=1;
		if(l==r){
			tr[p].val=a[l]%m;
			return;
		}
		int mid=l+r>>1;
		build(lp,l,mid);
		build(rp,mid+1,r);
		tr[p].val=(tr[lp].val+tr[rp].val)%m;
	}
	void updata1(int p,int l,int r,long long val){
		if(tr[p].l>=l&&tr[p].r<=r){
			tr[p].val=(tr[p].val+val*(tr[p].r-tr[p].l+1))%m;
			tr[p].plz=(tr[p].plz+val)%m;
			return;
		}
		pushdown(p);
		int mid=tr[p].l+tr[p].r>>1;
		if(l<=mid) updata1(lp,l,r,val);
		if(r>mid) updata1(rp,l,r,val);
		tr[p].val=(tr[lp].val+tr[rp].val)%m;
	}
	void updata2(int p,int l,int r,long long val){
		if(tr[p].l>=l&&tr[p].r<=r){
			tr[p].val=(tr[p].val*val)%m;
			tr[p].mlz=(tr[p].mlz*val)%m;
			tr[p].plz=(tr[p].plz*val)%m;
			return;
		}
		pushdown(p);
		int mid=tr[p].l+tr[p].r>>1;
		if(l<=mid) updata2(lp,l,r,val);
		if(r>mid) updata2(rp,l,r,val);
		tr[p].val=(tr[lp].val+tr[rp].val)%m;
	}
	long long query(int p,int l,int r){
		if(tr[p].l>=l&&tr[p].r<=r) return tr[p].val;
		pushdown(p);
		long long sum=0;
		int mid=(tr[p].l+tr[p].r)>>1;
		if(l<=mid) sum=(sum+query(lp,l,r))%m;
		if(r>mid) sum=(sum+query(rp,l,r))%m;
		return sum;
	}
}seg;
#undef lp
#undef rp
int main(){
	scanf("%d %d %d",&n,&q,&m);
	for(int i=1;i<=n;i++) scanf("%lld",a+i);
	seg.build(1,1,n);
	for(int i=1,op,x,y;i<=q;i++){
		scanf("%d",&op);
		if(op==1){
			long long k;
			scanf("%d %d %lld",&x,&y,&k);
			seg.updata1(1,x,y,k);
		}
		else if(op==2){
			long long k;
			scanf("%d %d %lld",&x,&y,&k);
			seg.updata2(1,x,y,k);
		}
		else{
			scanf("%d %d",&x,&y);
			printf("%lld\n",seg.query(1,x,y));
		}
	}
	return 0;
}

如果你也是这样写的,检查了半天没检查出问题,那恭喜你,你加法和乘法弄反了
(不会只有我眼瞎看错题吧)

2025/7/29 15:59
加载中...