社区讨论
捞,玄关
灌水区参与者 3已保存回复 6
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 6 条
- 当前快照
- 1 份
- 快照标识符
- @lzqwx88g
- 此快照首次捕获于
- 2024/08/12 19:30 2 年前
- 此快照最后确认于
- 2024/08/12 20:36 2 年前
P3372 【模板】线段树 1
线段树写挂了不知道哪错,求条
CPP#include<bits/stdc++.h>
#define int long long
using namespace std;
inline void read(int &x){
x=0;char v=getchar();
while(v<'0'||v>'9') v=getchar();
while(v>='0'&&v<='9') x=(x<<1)+(x<<3)+(v&15),v=getchar();
}
int n,m,a[1000010],tree[1000010],laz[1000010];
void build(int l,int r,int p){
if(l==r){
tree[p]=a[l];
return ;
}
int m=l+((r-l)>>1);
build(l,m,p*2);
build(m+1,r,p*2+1);
tree[p]=tree[p*2]+tree[p*2+1];
return ;
}
void update(int l,int r,int c,int s,int t,int p){
if(l<=s&&r>=t){
tree[p]+=(t-s+1)*c,laz[p]+=c;
return ;
}
int m=s+((t-s)>>1);
if(laz[p]&&l!=r){
laz[p*2]+=laz[p]*(m-s+1),laz[p*2+1]+=laz[p]*(t-m);
laz[p*2]+=laz[p],laz[p*2+1]+=laz[p];
laz[p]=0;
}
if(l<=m) update(l,r,c,s,m,p*2);
if(r>m) update(l,r,c,m+1,t,p*2+1);
tree[p]=tree[p*2]+tree[p*2+1];
return;
}
int get(int l,int r,int s,int t,int p){
if(l<=s&&r>=t){
return tree[p];
}
int m=s+((t-s)>>1);
if(laz[p]){
tree[p*2]+=laz[p]*(m-s+1),laz[p*2+1]+=laz[p]*(t-m);
laz[p*2]+=laz[p],laz[p*2+1]+=laz[p];
laz[p]=0;
}
int sum=0;
if(l<=m) sum+=get(l,r,s,m,p*2);
if(r>m) sum+=get(l,r,m+1,t,p*2+1);
return sum;
}
signed main(){
read(n),read(m);
for(int i=1;i<=n;i++) read(a[i]);
build(1,n,1);
int x,y,z,w;
for(int i=1;i<=m;i++){
read(x),read(y),read(z);
if(x==2){
cout<<get(y,z,1,n,1)<<endl;
}else{
read(w);
update(y,z,w,1,n,1);
}
}
return 0;
}
回复
共 6 条回复,欢迎继续交流。
正在加载回复...