社区讨论
悬棺,求调,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 条回复,欢迎继续交流。
正在加载回复...