求看一下线段树模板,样例也WA
  • 板块灌水区
  • 楼主fangzichang
  • 当前回复4
  • 已保存回复4
  • 发布时间2022/5/22 19:33
  • 上次更新2023/10/28 00:49:41
查看原帖
求看一下线段树模板,样例也WA
678087
fangzichang楼主2022/5/22 19:33

rt,模板2 模板2

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int n,m,op;
int p;
struct Node{
    int l,r,len;
    long long sum;
    int lazy,lazy2;
    //lazy加tag,lazy2乘tag 
}a[N*4];
void pushdown(int x){
	if(a[x].lazy||a[x].lazy2){
		a[x*2].sum+=a[x].lazy*a[x].len+a[x].lazy2*a[x*2].sum;
		a[x*2].sum%=p;
		a[x*2+1].sum+=a[x].lazy*a[x].len+a[x].lazy2*a[x*2+1].sum;
		a[x*2+1].sum%=p;		
		a[x*2].lazy2*=a[x].lazy2;
		a[x*2].lazy2%=p;		
		a[x*2+1].lazy2*=a[x].lazy2;
		a[x*2+1].lazy2%=p;
		a[x*2].lazy+=(a[x].lazy+a[x*2].lazy*a[x].lazy2);
		a[x*2+1].lazy+=(a[x].lazy+a[x*2+1].lazy*a[x].lazy2);
		a[x].lazy=0;
		a[x].lazy2=1;
		//应该好懂的 
	}
}
void bulid(int x,int l,int r){
	a[x].l=l;
	a[x].r=r;
	a[x].len=l+r-1;
	if(l==r){
		scanf("%d",&a[x].sum);
		return;
	}
	int mid=(l+r)>>1;
	bulid(x*2,l,mid);
	bulid(x*2+1,mid+1,r);
	a[x].sum=a[x*2].sum+a[x*2+1].sum;
}
void add(int x,int l,int r,int o){
	if(a[x].l<=l&&r>=a[x].r){
		a[x].sum+=o*a[x].len;
		a[x].sum%=p;
		a[x].lazy+=o;
		a[x].lazy%=p;
		return;
	}
	pushdown(x);
	int mid=(l+r)>>1;
	if(l<=mid)	add(x*2,l,r,o);
	if(r>=mid) add(x*2+1,l,r,o);
	a[x].sum=a[x*2].sum+a[x*2+1].sum;
	a[x].sum%=p;
}
void mul(int x,int l,int r,int o){
	if(a[x].l<=l&&r>=a[x].r){
		a[x].sum*=o;
		a[x].sum%=p;
		a[x].lazy*=o;
		a[x].lazy%=p;
		a[x].lazy2*=o;
		a[x].lazy2%=p;
		return;
	}
	pushdown(x);
	int mid=(l+r)>>1;
	if(l<=mid) mul(x*2,l,r,o);
	if(r>=mid) mul(x*2+1,l,r,o);
	a[x].sum=a[x*2].sum+a[x*2+1].sum;
	a[x].sum%=p;
}
long long ask(int x,int l,int r){
	if(l<=a[x].l&&a[x].r<=r){
		return a[x].sum;
	}
	pushdown(x);
	int mid=(a[x].l+a[x].r)>>1;
	long long t=0;
	if(l<=mid){
		t+=ask(x*2,l,r);
		t%=p;
	}
	if(r>mid){
		t+=ask(x*2+1,l,r);
		t%=p;
	}
	return t;
}
int main(){
	cin>>n>>m>>p;
	bulid(1,1,n);
	int x,y,k;
	while(m--){
		scanf("%d%d%d",&op,&x,&y);
		if(op==1){
			scanf("%d",&k);
			mul(1,x,y,k);
		}
		else if(op==2){
			scanf("%d",&k);
			add(1,x,y,k);
		}
		else{
			printf("%lld\n",ask(1,x,y));
		}
	}
	return 0;
}
2022/5/22 19:33
加载中...