萌新刚学线段树,60分求助
查看原帖
萌新刚学线段树,60分求助
339992
Icy_Fire楼主2020/7/23 22:18
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<climits>
using namespace std;
typedef long long ll;
const int maxn=1e5+10;
int a[maxn],n,m,mod;
struct SegmentTree{
	int l,r;
	int sum,add,mul;
	#define l(x) tree[x].l
	#define r(x) tree[x].r
	#define sum(x) tree[x].sum
	#define add(x) tree[x].add
	#define mul(x) tree[x].mul
}tree[maxn<<2];
inline void pushup(int p){
	sum(p)=(sum(p<<1)+sum(p<<1|1))%mod;
}
inline void pushdown(int p){
	if(add(p)||mul(p)!=1){
		sum(p<<1)=((ll)sum(p<<1)*mul(p)+(r(p<<1)-l(p<<1)+1)*add(p))%mod;
		sum(p<<1|1)=((ll)sum(p<<1|1)*mul(p)+(r(p<<1|1)-l(p<<1|1)+1)*add(p))%mod;
		mul(p<<1)=((ll)mul(p<<1)*mul(p))%mod;
		mul(p<<1|1)=((ll)mul(p<<1|1)*mul(p))%mod;
		add(p<<1)=((ll)add(p<<1)*mul(p)+add(p))%mod;
		add(p<<1|1)=((ll)add(p<<1|1)*mul(p)+add(p))%mod;
		mul(p)=1,add(p)=0;
	}
}
void build(int p,int l,int r){
	l(p)=l,r(p)=r,mul(p)=1;
	if(l==r){
		sum(p)=a[l]%mod,add(p)=0;
		return;
	}
	int mid=l+r>>1;
	build(p<<1,l,mid);
	build(p<<1|1,mid+1,r);
	pushup(p);
}
void change1(int p,int l,int r,int c){
	if(l<=l(p)&&r>=r(p)){
		sum(p)=((ll)sum(p)*c)%mod;
		add(p)=((ll)add(p)*c)%mod;
		mul(p)=((ll)mul(p)*c)%mod;
		return;
	}
	pushdown(p);
	int mid=l(p)+r(p)>>1;
	if(l<=mid) change1(p<<1,l,r,c);
	if(r>mid) change1(p<<1|1,l,r,c);
	pushup(p);
}
void change2(int p,int l,int r,int c){
	if(l<=l(p)&&r>=r(p)){
		sum(p)=((ll)sum(p)+(r(p)-l(p)+1)*c)%mod;
		add(p)=(add(p)+c)%mod;
		return;
	}
	pushdown(p);
	int mid=l(p)+r(p)>>1;
	if(l<=mid) change2(p<<1,l,r,c);
	if(r>mid) change2(p<<1|1,l,r,c);
	pushup(p);
}
int ask(int p,int l,int r){
	if(l<=l(p)&&r>=r(p)) return sum(p);
	pushdown(p);
	int mid=l(p)+r(p)>>1;
	int ans=0;
	if(l<=mid) ans=(ans+ask(p<<1,l,r))%mod;
	if(r>mid) ans=(ans+ask(p<<1|1,l,r))%mod;
	return ans;
} 
int main(){
	scanf("%d%d",&n,&mod);
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	build(1,1,n);
	scanf("%d",&m);
	while(m--){
		int opt,t,g,c;
		scanf("%d%d%d",&opt,&t,&g);
		switch(opt){
			case 1:
				scanf("%d",&c);
				change1(1,t,g,c);
				break;
			case 2:
				scanf("%d",&c);
				change2(1,t,g,c);
				break;
			case 3:
				printf("%d\n",ask(1,t,g));
		}
	}
	return 0;
}

求助大佬,这错在哪里了,我调了好长时间也没做出来 /fad

2020/7/23 22:18
加载中...