社区讨论
请大佬帮忙挑错(膝盖*3)
P3372【模板】线段树 1参与者 5已保存回复 35
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 35 条
- 当前快照
- 1 份
- 快照标识符
- @lo8vxx53
- 此快照首次捕获于
- 2023/10/28 01:26 2 年前
- 此快照最后确认于
- 2023/10/28 01:26 2 年前
Is there any DaLao to help me?
有大佬帮帮我这个小学僧兼蒟蒻吗?
code go go go!
CPP#include<bits/stdc++.h>
using namespace std;
long long tree[400005],a[100005],n,m,tag[400005];
void pushup(long long cur){
tree[cur]=tree[2*cur]+tree[2*cur+1];//l+r=father
return ;
}
void build(long long cur,long long lt,long long rt){
if(lt==rt){
tree[cur]=a[lt];
return ;
}
long long mid = (lt + rt)>>1;
build(2*cur,lt,mid);
build(2*cur+1,mid+1,rt);
pushup(cur);
return ;
}
void addtag(long long cur,long long lt,long long rt,long long val){
tag[cur]+=val;
tree[cur]+=(rt-lt+1)*val;
return ;
}
void pushdwon(long long cur,long long lt,long long rt){
if(tag[cur]==0){
return ;
}
long long mid=(lt+rt)>>1;
addtag(2*cur,lt,mid,tag[cur]);
addtag(2*cur+1,mid+1,rt,tag[cur]);
tag[cur]=0;
return ;
}
long long query(long long cur,long long lt,long long rt,long long qx,long long qy){
if(qy<lt||rt<qx){
return 0;
}
if(qx<=lt&&rt<=qy){
return tree[cur];
}
pushdwon(cur,lt,rt);
long long mid = (lt + rt)>>1;
return query(2*cur,lt,mid,qx,qy)+query(2*cur+1,mid+1,rt,qx,qy);
}
void update(long long cur,long long lt,long long rt,long long qx,long long qy,long long val){
if(qy<lt||rt<qx){
return ;
}
if(qx<=lt&&rt<=qy){
addtag(cur,lt,rt,val);
return;
}
pushdwon(cur,lt,rt);
long long mid = (lt + rt)>>1;
update(2*cur,lt,mid,qx,qy,val);
update(2*cur+1,mid+1,rt,qx,qy,val);
pushup(cur);
return ;
}
int main(){
ios_base::sync_with_stdio(0);//让cin/cout变快de黑科技x1
cin.tie(0);//让cin/cout变快de黑科技x2
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
build(1,1,n);
for(int i=1;i<=m;i++){
long long opt,x,y,val;
cin>>opt>>x>>y;
if(opt==1){
cin>>val;
update(1,1,n,x,y,val);
}
else{
cout<<query(1,1,n,x,y)<<"\n";
}
}
return 0;
}
违规自杀或删除本帖

回复
共 35 条回复,欢迎继续交流。
正在加载回复...