社区讨论
蒟蒻70pts3个点WA求调,玄关
P3372【模板】线段树 1参与者 4已保存回复 5
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 5 条
- 当前快照
- 1 份
- 快照标识符
- @lwbtlinv
- 此快照首次捕获于
- 2024/05/18 16:02 2 年前
- 此快照最后确认于
- 2024/05/18 18:23 2 年前
代码:
C#include <bits/stdc++.h>
using namespace std;
using ll=long long;
const int N=100005;
ll n,m;
ll a[N],tree[N*4],tag[N*4];
void build(ll p,ll pl,ll pr){
tag[p]=0;
if(pl==pr){
tree[p]=a[pl];
return;
}
ll mid=(pl+pr)/2;
build(p<<1,pl,mid);
build(p<<1|1,mid+1,pr);
tree[p]=tree[p<<1]+tree[p<<1|1];
}
void addtag(ll p,ll pl,ll pr,ll k){
tag[p]+=k;
tree[p]+=k*(pr-pl+1);
}
void push_down(ll p,ll pl,ll pr){
if(tag[p]){
ll mid=(pl+pr)>>1;
addtag(p<<1,pl,mid,tag[p]);
addtag(p<<1|1,mid+1,pr,tag[p]);
tag[p]=0;
}
}
void update(ll l,ll r,ll p,ll pl,ll pr,ll k){
if(pl>=l && pr<=r){
addtag(p,pl,pr,k);
return;
}
push_down(p,pl,pr);
ll mid=(pl+pr)>>1;
if(l<=mid)update(l,r,p<<1,pl,mid,k);
if(r>=mid+1)update(l,r,p<<1|1,mid+1,pr,k);
tree[p]=tree[p<<1]+tree[p<<1|1];
}
int query(ll l,ll r,ll p,ll pl,ll pr){
if(pl>=l && pr<=r)return tree[p];
push_down(p,pl,pr);
ll ans=0;
ll mid=(pl+pr)>>1;
if(l<=mid)ans+=query(l,r,p<<1,pl,mid);
if(r>=mid+1)ans+=query(l,r,p<<1|1,mid+1,pr);
return ans;
}
int main(){
cin>>n>>m;
for(ll i=1;i<=n;i++)cin>>a[i];
build(1,1,n);
ll z,x,y,k;
for(ll i=1;i<=m;i++){
cin>>z;
if(z==1){
cin>>x>>y>>k;
update(x,y,1,1,n,k);
}else{
cin>>x>>y;
cout<<query(x,y,1,1,n)<<endl;
}
}
return 0;
}
回复
共 5 条回复,欢迎继续交流。
正在加载回复...