社区讨论
爆零了(求条)
P3373【模板】线段树 2参与者 2已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @mhk7en38
- 此快照首次捕获于
- 2025/11/04 14:44 4 个月前
- 此快照最后确认于
- 2025/11/04 14:44 4 个月前
CPP
#include <bits/stdc++.h>
using namespace std;
struct node{
long long p,c;
}tax[400005];
long long n,q,k;
long long mod;
struct node2{
long long l,r;
long long sum;
}tree[400005];
long long a[100005];
void build(long long l,long long r,long long x){
tax[x].c=1;
if(r==l){
tree[x].sum=a[l];
tree[x].l=l;
tree[x].r=r;
return ;
}
long long mid=(l+r)/2;
build(l,mid,x*2);
build(mid+1,r,x*2+1);
tree[x].sum=(tree[x*2].sum+tree[x*2+1].sum)%mod;
}
void push_down(long long l,long long r,long long x){
if(tax[x].c!=0){
tax[x*2].c*=tax[x].c;
tax[x*2].c%=mod;
tax[x*2+1].c*=tax[x].c;
tax[x*2+1].c%=mod;
tree[x*2].sum=tree[x*2].sum*tax[x].c%mod;
tree[x*2+1].sum=tree[x*2+1].sum*tax[x].c%mod;
}
if(tax[x].p!=0){
tax[x*2].p+=tax[x].p;
tax[x*2+1].p+=tax[x].p;
tree[x*2].sum+=tax[x].p*(tree[x*2].r-tree[x*2].l+1);
tree[x*2+1].sum+=tax[x].p*(tree[x*2+1].r-tree[x*2+1].l+1);
}
tax[x].c=1;
tax[x].p=0;
}
void add1(long long l,long long r,long long a,long long b,long long x){
if(a<=l && r<=b){
push_down(l,r,x);
tax[x].p+=k;
tax[x].p%=mod;
tree[x].sum+=k*(r-l+1);
tree[x].sum%=mod;
//cout<<l<<' '<<r<<' '<<tree[x].sum<<endl;
return ;
}
push_down(l,r,x);
long long mid=(l+r)/2;
if(mid>=a) add1(l,mid,a,b,x*2);
if(mid<b) add1(mid+1,r,a,b,x*2+1);
tree[x].sum=(tree[x*2].sum+tree[x*2+1].sum)%mod;
}
void add2(long long l,long long r,long long a,long long b,long long x){
if(a<=l && r<=b){
push_down(l,r,x);
tax[x].c*=k;
tax[x].c%=mod;
tree[x].sum*=k;
tree[x].sum%=mod;
return ;
}
push_down(l,r,x);
long long mid=(l+r)/2;
if(mid>=a) add2(l,mid,a,b,x*2);
if(mid<b) add2(mid+1,r,a,b,x*2+1);
tree[x].sum=(tree[x*2].sum+tree[x*2+1].sum)%mod;
}
long long merge(long long l,long long r,long long a,long long b,long long x){
if(a<=l && r<=b){
push_down(l,r,x);
//cout<<l<<' '<<r<<' '<<tree[x].sum<<endl;
return tree[x].sum;
}
push_down(l,r,x);
long long mid=(l+r)/2;
long long ret=0;
if(mid>=a) ret+=merge(l,mid,a,b,x*2);
if(mid<b) ret+=merge(mid+1,r,a,b,x*2+1);
ret%=mod;
return ret%mod;
}
int main(){
scanf("%lld%lld%lld",&n,&q,&mod);
for(long long i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
build(1,n,1);//cerr<<"aaa";
long long a,b,t;
for(long long i=1;i<=q;i++){
scanf("%lld%lld%lld",&t,&a,&b);
if(t==2){
scanf("%lld",&k);
add1(1,n,a,b,1);
//cout<<merge(1,n,a,b,1)<<endl;
}else if(t==1){
scanf("%lld",&k);
add2(1,n,a,b,1);
//cout<<merge(1,n,a,b,1)<<endl;
}else{
cout<<merge(1,n,a,b,1)<<endl;
}
}
return 0;
}/*
5 5 10000
1 1 1 1 1
2 1 4 5
1 2 5 2
*/
回复
共 2 条回复,欢迎继续交流。
正在加载回复...