社区讨论

悬棺,求调,WA0,序列分块

题目总版参与者 2已保存回复 2

讨论操作

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

当前回复
2 条
当前快照
1 份
快照标识符
@lxx8yb4m
此快照首次捕获于
2024/06/27 20:34
2 年前
此快照最后确认于
2024/06/27 23:51
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
long long int op,n,m,l,r,k,a[200005],bb[200005],tag[200005],len,lon;
struct node{
	long long int l,r,sum,cnt;
}ku[200005];
void change(long long int ll,long long int rr,long long int val){
	for(int i=ll;i<=min(ku[bb[ll]].r,rr);i++) ku[bb[ll]].sum-=a[i],a[i]+=val,ku[bb[ll]].sum+=a[i];
	for(int i=bb[ll]+1;i<=bb[rr]-1;i++) tag[i]+=val;
	if(bb[ll]!=bb[rr]) for(int i=ku[bb[rr]].l;i<=rr;i++) ku[bb[rr]].sum-=a[i],a[i]+=val,ku[bb[ll]].sum+=a[i];
}
long long ask(long long int ll,long long int rr){
	long long ans=0;
	for(int i=ku[bb[ll]].l;i<=ku[bb[ll]].r;i++) ku[bb[ll]].sum-=a[i],a[i]+=tag[bb[ll]],ku[bb[ll]].sum+=a[i];
	tag[bb[ll]]=0;
	for(int i=ku[bb[rr]].l;i<=ku[bb[rr]].r;i++) ku[bb[rr]].sum-=a[i],a[i]+=tag[bb[rr]],ku[bb[rr]].sum+=a[i];
	tag[bb[rr]]=0;
	for(int i=ll;i<=min(ku[bb[ll]].r,rr);i++) ans+=a[i];
	for(int i=bb[ll]+1;i<=bb[rr]-1;i++) ans=ans+ku[i].sum+tag[i]*ku[i].cnt;
	if(bb[ll]!=bb[rr]) for(int i=ku[bb[rr]].l;i<=rr;i++) ans+=a[i];
	return ans;
}
int main(){
	scanf("%lld%lld",&n,&m);
	lon=sqrt(n);
	for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
	for(int i=1;i<=n;i++){
		bb[i]=i/lon+1;
		ku[i/lon+1].cnt++,ku[i/lon+1].sum+=a[i];
		if(i/lon+1!=(i-1)/lon+1) ku[(i-1)/lon+1].r=i-1,ku[i/lon+1].l=i;
	}
	ku[1].l=1;
	ku[n/lon+1].r=n;
	for(int i=1;i<=m;i++){
		scanf("%lld",&op);
		if(op==1){
			scanf("%lld%lld%lld",&l,&r,&k);
			change(l,r,k);
		}else{
			scanf("%lld%lld",&l,&r);
			printf("%lld\n",ask(l,r));
		}
	}
}

回复

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

正在加载回复...