社区讨论

分块最后一个点为什么T了

P2357守墓人参与者 3已保存回复 5

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
4 条
当前快照
1 份
快照标识符
@mdfeu8su
此快照首次捕获于
2025/07/23 11:34
8 个月前
此快照最后确认于
2025/07/23 16:17
8 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
int n,f,sum,id[200005];
long long m[200005],g[200005];
int main(){
	scanf("%d%d",&n,&f);
	sum=sqrt(n);
	for(int i=1;i<=n;i++){
		scanf("%lld",&m[i]);
		id[i]=(i-1)/sum+1;
	}
	for(int i=1;i<=f;i++){
		int x;
		scanf("%d",&x);
		if(x==1){
			int l,r;
			long long k;
			scanf("%d%d %lld",&l,&r,&k);
			int start=id[l],end=id[r];
			for(int i=l;i<=min(r,start*sum);i++)m[i]+=k;
			if(start!=end)for(int i=end*sum-sum+1;i<=r;i++)m[i]+=k;
			for(int i=start+1;i<=end-1;i++)g[i]+=k;
		}
		else if(x==2){
			long long k;
			scanf("%lld",&k);
			m[1]+=k;
		}
		else if(x==3){
			long long k;
			scanf("%lld",&k);
			m[1]-=k;
		}
		else if(x==4){
			int l,r;
			long long cnt=0;
			scanf("%d%d",&l,&r);
			for(int j=l;j<=r;j++)cnt+=m[j]+g[id[j]];
			printf("%lld\n",cnt);
		}
		else printf("%lld\n",m[1]);
	}
	return 0;
} 

回复

5 条回复,欢迎继续交流。

正在加载回复...