社区讨论
分块不过样例求助qwq
P3372【模板】线段树 1参与者 2已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @lo2bt0i3
- 此快照首次捕获于
- 2023/10/23 11:16 2 年前
- 此快照最后确认于
- 2023/11/03 11:25 2 年前
CPP
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5+10;
int n,m,q,a[N],bel[N],st[N],ed[N],sz[N],sum[N],tag[N];
inline void init() {
m=sqrt(n);
for(int i=1;i<=m;++i)
st[i]=n/m*(i-1)+1,ed[i]=n/m*i;
ed[m]=n;
for(int i=1;i<=m;++i)
for(int j=st[i];j<=ed[i];++j)
bel[j]=i,sum[i]+=a[j];
for(int i=1;i<=m;++i)
sz[i]=ed[i]-st[i]+1;
}
inline void modify(int l,int r,int d) {
if(bel[l]==bel[r])
for(int i=st[bel[l]];i<=ed[bel[l]];++i)
a[i]+=d,sum[bel[i]]+=d;
else {
for(int i=l;i<=ed[bel[l]];++i)
a[i]+=d,sum[bel[i]]+=d;
for(int i=st[bel[l]];i<=r;++i)
a[i]+=d,sum[bel[i]]+=d;
for(int i=bel[l]+1;i<bel[r];++i)
tag[i]+=d;
}
}
inline int query(int l,int r) {
int res=0;
if(bel[l]==bel[r])
for(int i=st[bel[l]];i<=ed[bel[l]];++i)
res+=a[i]+tag[bel[i]];
else {
for(int i=l;i<=ed[bel[l]];++i)
res+=a[i]+tag[bel[i]];
for(int i=st[bel[l]];i<=r;++i)
res+=a[i]+tag[bel[i]];
for(int i=bel[l]+1;i<bel[r];++i)
res+=sum[i]+tag[i]*sz[i];
}
return res;
}
signed main() {
ios::sync_with_stdio(NULL);
cin>>n>>q;
for(int i=1;i<=n;++i)
cin>>a[i];
init();
while(q--) {
int opt, x, y, k;
cin>>opt>>x>>y;
if(opt==1) cin>>k,modify(x,y,k);
else cout<<query(x,y)<<endl;
}
return 0;
}
回复
共 2 条回复,欢迎继续交流。
正在加载回复...