社区讨论
数据范围不是1e5吗,为啥只有我要开1e6?
P3373【模板】线段树 2参与者 6已保存回复 11
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 11 条
- 当前快照
- 1 份
- 快照标识符
- @mihe3rke
- 此快照首次捕获于
- 2025/11/27 20:08 3 个月前
- 此快照最后确认于
- 2025/11/28 22:20 3 个月前
RT,但是
我RE了,然后把范围改成
?????
RE code:
CPP#include<iostream>
#include<algorithm>
#include<cstring>
#include<array>
using namespace std;
#define int long long
const int MAXN = 1e5+5;
int m;
array<int,MAXN> a;
struct SegmentTree{
int l,r;
int lazy1,lazy2;
int sum;
}t[MAXN<<2];
#define ls (p<<1)
#define rs (p<<1|1)
void build(int p,int l,int r){
t[p].l=l,t[p].r=r,t[p].lazy1=0,t[p].lazy2=1;
if(l==r) t[p].sum=a[l];
else{
int mid=(l+r)>>1;
build(ls,l,mid),build(rs,mid+1,r);
t[p].sum=t[ls].sum+t[rs].sum;
}
t[p].sum%=m;
}
void pushdown(int p){
if(t[p].lazy2!=1){
t[ls].lazy2*=t[p].lazy2;
t[rs].lazy2*=t[p].lazy2;
t[ls].sum*=t[p].lazy2;
t[rs].sum*=t[p].lazy2;
t[ls].lazy1*=t[p].lazy2;
t[rs].lazy1*=t[p].lazy2;
t[p].lazy2=1;
}
if(t[p].lazy1!=0){
t[ls].lazy1+=t[p].lazy1;
t[rs].lazy1+=t[p].lazy1;
t[ls].sum+=(t[ls].r-t[ls].l+1)*t[p].lazy1;
t[rs].sum+=(t[rs].r-t[rs].l+1)*t[p].lazy1;
t[p].lazy1=0;
}
t[ls].lazy1%=m,t[ls].lazy2%=m,t[ls].sum%=m;
t[rs].lazy1%=m,t[rs].lazy2%=m,t[rs].sum%=m;
}
void update1(int p,int l,int r,int k){
int pl=t[p].l,pr=t[p].r;
if(pl>r||pr<l) return;
pushdown(p);
if(pl>=l&&pr<=r) t[p].lazy1+=k,t[p].sum+=(pr-pl+1)*k;
else{
update1(ls,l,r,k),update1(rs,l,r,k);
t[p].sum=t[ls].sum+t[rs].sum;
}
t[p].lazy1%=m,t[p].lazy2%=m,t[p].sum%=m;
}
void update2(int p,int l,int r,int k){
int pl=t[p].l,pr=t[p].r;
if(pl>r||pr<l) return;
pushdown(p);
if(pl>=l&&pr<=r) t[p].lazy1*=k,t[p].lazy2*=k,t[p].sum*=k;
else{
update2(ls,l,r,k),update2(rs,l,r,k);
t[p].sum=t[ls].sum+t[rs].sum;
}
t[p].lazy1%=m,t[p].lazy2%=m,t[p].sum%=m;
}
int query(int p,int l,int r){
int pl=t[p].l,pr=t[p].r;
if(pl>r||pr<l) return 0;
pushdown(p);
if(pl>=l&&pr<=r) return t[p].sum%m;
else return (query(ls,l,r)+query(rs,l,r))%m;
}
int n,q;
signed main(){
ios::sync_with_stdio(false);
cin.tie(nullptr),cout.tie(nullptr);
cin>>n>>q>>m;
for(int i=1;i<=n;i++) cin>>a[i];
build(1,1,n);
while(q--){
int opt;cin>>opt;
if(opt==1){
int x,y,k;cin>>x>>y>>k;
update2(1,x,y,k%m);
}else if(opt==2){
int x,y,k;cin>>x>>y>>k;
update1(1,x,y,k%m);
}else if(opt==3){
int x,y;cin>>x>>y;
cout<<query(1,x,y)<<endl;
}
}
return 0;
}
回复
共 11 条回复,欢迎继续交流。
正在加载回复...