线段树2,30pts求助
  • 板块学术版
  • 楼主PCCP
  • 当前回复2
  • 已保存回复2
  • 发布时间2022/8/27 17:08
  • 上次更新2023/10/27 13:26:35
查看原帖
线段树2,30pts求助
310773
PCCP楼主2022/8/27 17:08

由于学校32位垃圾电脑运行大样例直接爆炸,且你谷IDE无法运行大样例,所以蒟蒻根本不知道问题出在哪里了。

看讨论发现很多30pts的,但是对比之后并没有发现蒟蒻有哪些错误。

请问有没有大佬可以帮忙看看蒟蒻的代码,或者提供前车之鉴呢,谢谢各位大佬了QWQ

#include<iostream>
#include<cstdio>
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n,m,p;
struct edgetree{
	int l,r;
	long long sum;
	int xla,jla;
}tr[N<<2];
struct doo{
	void pushup(int x){
		tr[x].sum=(tr[x<<1].sum+tr[x<<1|1].sum)%p;
	}
	void plusit(int x,int k){
    	tr[x].sum=(tr[x].sum+(long long)(tr[x].r-tr[x].l+1)*k%p)%p;
    	tr[x].jla=(tr[x].jla+k)%p;
	}
	void timesit(int x,int k){
    	tr[x].sum=(long long)tr[x].sum*k%p;
    	tr[x].jla=(long long)tr[x].jla*k%p;
    	tr[x].xla=(long long)tr[x].xla*k%p;
	}
	void pushdown(int x){
		if(tr[x].xla!=1){
        	timesit(x<<1,tr[x].xla);
        	timesit(x<<1|1,tr[x].xla);
        	tr[x].xla=1;
    	}
    	if(tr[x].jla!=0){
        	plusit(x<<1,tr[x].jla);
        	plusit(x<<1|1,tr[x].jla);
        	tr[x].jla=0;
    	}
    	return;
	}
	void build(int x,int l,int r){
		tr[x].l=l;
		tr[x].r=r;
		tr[x].jla=0;
		tr[x].xla=1;
		if(tr[x].l==tr[x].r){
			scanf("%lld",&tr[x].sum);
			return;
		}
		int mid=(tr[x].l+tr[x].r)>>1;
		build(x<<1,l,mid);
		build(x<<1|1,mid+1,r);
		pushup(x);
		return;
	}
	void cf(int x,int l,int r,int z){
		if(l<=tr[x].l&&tr[x].r<=r){
			timesit(x,z);
			return;
		}
		pushdown(x);
		int mid=(tr[x].l+tr[x].r)>>1;
		if(l<=mid){
			cf(x<<1,l,r,z);
		}
		if(r>mid){
			cf(x<<1|1,l,r,z);
		}
		pushup(x);
		return;
	}
	void jf(int x,int l,int r,int z){
		if(l<=tr[x].l&&tr[x].r<=r){
			plusit(x,z);
			return;
		}
		pushdown(x);
		int mid=(tr[x].l+tr[x].r)>>1;
		if(l<=mid){
			jf(x<<1,l,r,z);
		}
		if(r>mid){
			jf(x<<1|1,l,r,z);
		}
		pushup(x);
		return;
	}
	long long query(int x,int l,int r){
		long long res=0;
		if(l<=tr[x].l&&tr[x].r<=r){
			return tr[x].sum%p;
		}
		pushdown(x);
		int mid=(tr[x].l+tr[x].r)>>1;
		if(l<=mid){
			res+=query(x<<1,l,r)%p;
		}
		if(r>mid){
			res+=query(x<<1|1,l,r)%p;
		}
    	pushup(x);
    	return res;
	}
}tree;
int main(){
	scanf("%d%d%d",&n,&m,&p);
	int op,x,y,k;
	tree.build(1,1,n);
	for(int i=1;i<=m;i++){
		scanf("%d%d%d",&op,&x,&y);
		if(op==1){
			scanf("%d",&k);
			tree.cf(1,x,y,k);
		}
		else if(op==2){
			scanf("%d",&k);
			tree.jf(1,x,y,k);
		}
		else{
			//cout<<"11111111111111111"<<endl;
			printf("%lld\n",tree.query(1,x,y));
		}
	}
}
2022/8/27 17:08
加载中...