社区讨论

最后一点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 条回复,欢迎继续交流。

正在加载回复...