社区讨论

线段二求调,没找出来是哪里的问题23333

P3373【模板】线段树 2参与者 3已保存回复 14

讨论操作

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

当前回复
14 条
当前快照
1 份
快照标识符
@lo7ix0ph
此快照首次捕获于
2023/10/27 02:34
2 年前
此快照最后确认于
2023/10/27 02:34
2 年前
查看原帖
CPP
//<Tree>
#include<iostream>
using namespace std;
unsigned long long a[500001],p;
struct node{
	unsigned long long l,r,mid;
	unsigned long long sum,lan,mul;
}t[9999999];

inline void pushup(long long p){
	t[p].sum=(t[p*2].sum+t[p*2+1].sum)%p;
}

inline void build(long long p,long long l,long long r){
	t[p].l=l,t[p].r=r,t[p].mid=(l+r)/2;
	if(l==r)t[p].sum=a[l];
	else{
		build(p*2,l,t[p].mid);
		build(p*2+1,t[p].mid+1,r);
	    pushup(p);
	}
}
inline void add(long long p,long long x){
	t[p].sum+=((t[p].r-t[p].l+1)*x)%p;
    t[p].lan+=x%p;
}

inline void plus_add(long long p,long long x){
	t[p].sum*=(t[p].sum*x)%p;
    t[p].lan*=x%p;
    t[p].mul*=x%p;
}

inline void pushdown(long long p){
	if(t[p].lan==0)return;
	add(p*2,t[p].lan%p);
	add(p*2+1,t[p].lan%p);
	t[p].lan=0;
}

inline void plus_pushdown(long long p){
    if(t[p].mul==0)return;
    plus_add(p*2,t[p].mul%p);
    plus_add(p*2+1,t[p].mul%p);
    t[p].mul=0;
}

inline void add(long long p,long long l,int r,long long x){
	if(t[p].l>=l&&t[p].r<=r)add(p,x);
	else{
		pushdown(p);
	    if(t[p].mid>=l)add(p*2,l,r,x);
	    if(t[p].mid<r)add(p*2+1,l,r,x);
	    pushup(p);
	}
}

inline void plus_add(long long p,long long l,int r,long long x){
	if(t[p].l>=l&&t[p].r<=r)plus_add(p,x);
	else{
		plus_pushdown(p);
	    if(t[p].mid>=l)plus_add(p*2,l,r,x);
	    if(t[p].mid<r)plus_add(p*2+1,l,r,x);
	    pushup(p);
	}
}

inline long long sum(long long p,long long l,long long r){
	if(t[p].l>=l&&t[p].r<=r)return t[p].sum;
	else{
		pushdown(p),plus_pushdown(p);
		long long ans=0;
		if(t[p].mid>=l) ans+=sum(p*2,l,r);
		if(t[p].mid<r) ans+=sum(p*2+1,l,r);
		pushup(p);
        return ans;
	}
}
signed main(){
	long long n,m;
	cin>>n>>m>>p;
	for(int i=1;i<=n;++i) cin>>a[i];
	build(1,1,n);
	while(m--){
		long long op;
		cin>>op;
		if(op==1){
			int l,r,k;
			cin>>l>>r>>k;
			plus_add(1,l,r,k);
		}
        if(op==2){
            int l,r,k;
            cin>>l>>r>>k;
            add(1,l,r,k);
        }
		if(op==3){
			int l,r;
			cin>>l>>r;
			cout<<sum(1,l,r)<<endl;
		}
	} 
	return 0;
}
感谢大佬

回复

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

正在加载回复...