社区讨论
最后一点WA了,求调
P2357守墓人参与者 2已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @miflws9s
- 此快照首次捕获于
- 2025/11/26 14:11 3 个月前
- 此快照最后确认于
- 2025/11/26 15:42 3 个月前
最后一点WA了,求调
CPP#include <bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(0),cin.tie(0)
#define ll long long
#define lf(x) x<<1
#define rf(x) x<<1|1
const int maxx=2e5+4;
int n,f,a[maxx];
struct st{
ll sm,la;
}tree[maxx*4];
void up(int k){
tree[k].sm=tree[lf(k)].sm+tree[rf(k)].sm;
}
void down(int k,int l,int r){
int mid=(l+r)>>1;
tree[lf(k)].sm+=tree[k].la*(mid-l+1);
tree[lf(k)].la+=tree[k].la;
tree[rf(k)].sm+=tree[k].la*(r-mid);
tree[rf(k)].la+=tree[k].la;
tree[k].la=0;
}
void build(int k,int l,int r){
if (l==r){
tree[k].sm=a[l];
return;
}
int mid=(l+r)>>1;
build(lf(k),l,mid),build(rf(k),mid+1,r);
up(k);
}
void updata(int k,int l,int r,int ql,int qr,int c){
if (ql<=l&&qr>=r){
tree[k].sm+=(r-l+1)*c;
tree[k].la+=c;
return;
}
down(k,l,r);
int mid=(l+r)>>1;
if (ql<=mid) updata(lf(k),l,mid,ql,qr,c);
if (qr>mid) updata(rf(k),mid+1,r,ql,qr,c);
up(k);
}
ll search(int k,int l,int r,int ql,int qr){
if (ql<=l&&qr>=r) return tree[k].sm;
down(k,l,r);
ll mid=(l+r)>>1,ans=0;
if (ql<=mid) ans=search(lf(k),l,mid,ql,qr);
if (qr>mid) ans+=search(rf(k),mid+1,r,ql,qr);
return ans;
}
int main(){
IOS;
cin>>n>>f;
for (int i=1;i<=n;i++) cin>>a[i];
build(1,1,n);
while (f--){
int opt,l,r,k;
cin>>opt;
if (opt==1){
cin>>l>>r>>k;
updata(1,1,n,l,r,k);
}
else if (opt==2){
cin>>k;
updata(1,1,n,1,1,k);
}
else if (opt==3){
cin>>k;
updata(1,1,n,1,1,-k);
}
else if (opt==4){
cin>>l>>r;
cout<<search(1,1,n,l,r)<<"\n";
}
else cout<<search(1,1,n,1,1)<<"\n";
}
return 0;
}
回复
共 2 条回复,欢迎继续交流。
正在加载回复...