社区讨论
RE求条
P3372【模板】线段树 1参与者 5已保存回复 25
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 25 条
- 当前快照
- 1 份
- 快照标识符
- @mhjhqo56
- 此快照首次捕获于
- 2025/11/04 02:46 4 个月前
- 此快照最后确认于
- 2025/11/04 06:22 4 个月前
应该是add函数RE了,但蒟蒻看不出来
CPP#include <bits/stdc++.h>
using namespace std;
using ll=long long;
int ls(int p){return p<<1;}
int rs(int p){return p<<1|1;}
struct node{
int l,r;
ll lazy,sum;
}t[1000000];
int a[100005];
void Assignment(int p){t[p].sum=t[ls(p)].sum+t[rs(p)].sum;}
void Delaymark(int p,int v){
t[p].sum=(t[p].r-t[p].l+1)*v;
t[p].lazy=v;
}
void TransmitLazy(int p){
if(t[p].lazy){
Delaymark(ls(p),t[p].lazy);
Delaymark(rs(p),t[p].lazy);
t[p].lazy=0;
}
}
void built(int p,int l,int r){
t[p].l=l;
t[p].r=r;
if(l==r){
t[p].sum=a[l];
t[p].lazy=0;
return ;
}
int mid=(l+r)/2;
built(ls(p),l,mid);
built(rs(p),mid+1,r);
Assignment(p);
}
void add(int p,int st,int ed,int v){
if(st<=t[p].l&&t[p].r>=ed){
Delaymark(p,v);
return ;
}
TransmitLazy(p);
int mid=(t[p].l+t[p].r)/2;
if(st<=mid)add(ls(p),st,ed,v);
if(ed>mid)add(rs(p),st,ed,v);
Assignment(p);
}
int find(int p,int st,int ed){
if(st<=t[p].l&&ed>=t[p].r)return t[p].sum;
TransmitLazy(p);
int mid=(t[p].l+t[p].r)/2;
int ans=0;
if(st<=mid)ans+=find(ls(p),st,ed);
if(ed>mid)ans+=find(rs(p),st,ed);
Assignment(p);
return ans;
}
int main(){
ios::sync_with_stdio(false),cin.tie(0);
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>a[i];
built(1,1,n);
for(int i=1;i<=m;i++){
int z,x,y;
cin>>z>>x>>y;
if(z==1){
int k;cin>>k;
add(1,x,y,k);
}else cout<<find(1,x,y)<<"\n";
}
return 0;
}
回复
共 25 条回复,欢迎继续交流。
正在加载回复...