社区讨论

分块不过样例求助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 条回复,欢迎继续交流。

正在加载回复...