社区讨论
HELP!
P3372【模板】线段树 1参与者 8已保存回复 21
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 21 条
- 当前快照
- 1 份
- 快照标识符
- @mi7wwhmu
- 此快照首次捕获于
- 2025/11/21 04:56 4 个月前
- 此快照最后确认于
- 2025/11/21 06:49 4 个月前
RT,谢谢大佬
code:
CPP#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cctype>
using namespace std;
typedef long long ll;
int n,m,a[100005];
ll sum[100005],tag[100005];
inline int read(){
int x=0;short w=0;char ch=0;
while(!isdigit(ch)) {w|=ch=='-';ch=getchar();}
while(isdigit(ch)) {x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return w?-x:x;
}
void PushUp(int rt){
sum[rt]=sum[rt<<1]+sum[rt<<1|1];
}
void PushDown(int rt,int ln,int rn){
if(tag[rt]){
tag[rt<<1]+=tag[rt];sum[rt<<1]+=tag[rt]*ln;
tag[rt<<1|1]+=tag[rt];sum[rt<<1|1]+=tag[rt]*rn;
tag[rt]=0;
}
}
void Build(int l,int r,int rt){
if(l==r){
sum[l]=a[l];
return;
}
int m=(l+r)>>1;
Build(l,m,rt<<1);
Build(m+1,r,rt<<1|1);
PushUp(rt);
}
void Update(int L,int R,int C,int l,int r,int rt){
if(L<=l&&r<=R){
sum[rt]+=C*(r-l+1);
tag[rt]+=C;
return;
}
int m=(l+r)>>1;
PushDown(rt,m-l+1,r-m);
if(L<=m)Update(L,R,C,l,m,rt<<1);
if(R>m)Update(L,R,C,m+1,r,rt<<1|1);
PushUp(rt);
}
ll Query(int L,int R,int l,int r,int rt){
if(L<=l&&r<=R)return sum[rt];
int m=(l+r)>>1;
ll res=0;
if(L<=m)res+=Query(L,R,l,m,rt<<1);
if(R>m)res+=Query(L,R,m+1,r,rt<<1|1);
return res;
}
int main(){
n=read();m=read();
for(int i=1;i<=n;i++)a[i]=read();
Build(1,n,1);
while(m--){
int tmpq;
tmpq=read();
if(tmpq==1){
int tmpx,tmpy,tmpz;
tmpx=read();tmpy=read();tmpz=read();
Update(tmpx,tmpy,tmpz,1,n,1);
}
else{
int tmpx,tmpy;
tmpx=read();tmpy=read();
cout<<Query(tmpx,tmpy,1,n,1)<<endl;
}
}
return 0;
}
回复
共 21 条回复,欢迎继续交流。
正在加载回复...