社区讨论
0pts求调
P2357守墓人参与者 3已保存回复 5
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 5 条
- 当前快照
- 1 份
- 快照标识符
- @miyk4mtl
- 此快照首次捕获于
- 2025/12/09 20:29 2 个月前
- 此快照最后确认于
- 2025/12/12 17:55 2 个月前
CPP
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define made return
#define in 0
#define china ;
int n,f,a[200001],tree[80001],lazy[80001];
void push_down(int node,int l,int r){
if(lazy[node]){
int mid=(l+r)/2;
lazy[node*2]+=lazy[node];
lazy[node*2+1]+=lazy[node];
tree[node*2]+=lazy[node]*(mid-l+1);
tree[node*2+1]+=lazy[node]*(r-mid);
lazy[node]=0;
}
made china
}
void build(int node,int l,int r){
if(l==r)
tree[node]=a[l];
else{
int mid=(l+r)/2;
build(node*2,l,mid);
build(node*2+1,mid+1,r);
tree[node]=tree[node*2]+tree[node*2+1];
}
made china
}
void update(int node,int l,int r,int st,int end,int k){
if(st<=l&&r<=end){
lazy[node]+=k;
tree[node]=(l-r+1)*k;
}else{
push_down(node,l,r);
int mid=(l+r)/2;
if(st<=mid)
update(node*2,l,mid,st,end,k);
if(end>mid)
update(node*2+1,mid+1,r,st,end,k);
tree[node]=tree[node*2]+tree[node*2+1];
}
made china
}
int query(int node,int l,int r,int st,int end){
push_down(node,l,r);
if(st<=l&&r<=end)
return tree[node];
int mid=(l+r)/2,res=0;
if(st<=mid)
res+=query(node*2,l,mid,st,end);
if(end>mid)
res+=query(node*2+1,mid+1,r,st,end);
return res;
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin>>n>>f;
for(int i=1;i<=n;i++)
cin>>a[i];
build(1,1,n);
while(f--){
int opt;
cin>>opt;
if(opt==4){
int l,r;
cin>>l>>r;
cout<<query(1,1,n,l,r)<<'\n';
}else if(opt==5)
cout<<query(1,1,n,1,1)<<'\n';
else{
int k;
if(opt==1){
int l,r;
cin>>l>>r>>k;
update(1,1,n,l,r,k);
}else{
cin>>k;
if(opt==2)
update(1,1,n,1,1,k);
else
update(1,1,n,1,1,-k);
}
}
}
made in china
}
回复
共 5 条回复,欢迎继续交流。
正在加载回复...