社区讨论

原来超级树状数组并不是完全等同于普通树状数组吗?

AT_abc378_e[ABC378E] Mod Sigma Problem参与者 2已保存回复 1

讨论操作

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

当前回复
1 条
当前快照
1 份
快照标识符
@m35cvgit
此快照首次捕获于
2024/11/06 12:05
去年
此快照最后确认于
2024/11/06 17:08
去年
查看原帖
为啥普通树状数组板子过了,我这个支持区间修改的wa了
CPP
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define PII pair<int,int>
#define tul tuple<int,int,int>
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define rep_(i,a,b) for(int i=a;i>=b;--i)
#define all(x) x.begin(),x.end()
#define bp(x) __builtin_popcountll(x)
#define cy cout<<"YES"<<endl
#define cn cout<<"NO"<<endl
#define lc (rt<<1)
#define rc (rt<<1|1)
mt19937_64 rnd(time(0));
const int N=3e5+5,yyx=1e9+7;
vector<PII> to[N];
int n,m,a[N],pre[N];
inline int mod(int x){
  if(x<m) return x;
  return x-x/m*m;
}
inline int cmin(int &x,int y){
  return x>y?x=y,1:0;
}
inline int cmax(int &x,int y){
  return x<y?x=y,1:0;
}
struct FCW{
    vector<int> t1,t2;
    int n;
    FCW(int nn){
        t1.resize(nn+1,0);
        t2.resize(nn+1,0);
        n=nn;
    }
    void update(int x,int k){
        for(int i=x;x&&i<=n;i+=(i&-i)){
            t1[i]+=k;t2[i]+=(x-1)*k;
        }
    }
    void update(int l,int r,int k){
        update(l,k);update(r+1,-k);
    }
    int query(int x){
        int sum1=0,sum2=0;
        for(int i=x;i>0;i-=(i&-i)){
            sum1+=t1[i];
            sum2+=t2[i];
        }
        return sum1*x-sum2;
    }
    int query(int x,int y){
        return query(y)-query(x-1);
    }
};
inline void solve(){
  cin>>n>>m;
  FCW fcw(m+5);
  rep(i,1,n) cin>>a[i],pre[i]=mod(pre[i-1]+a[i]);
  int ans=0;
  int j=0;
  rep(i,1,n){
    ans+=pre[i]*i-j;
    int x=fcw.query(m)-fcw.query(pre[i]);
    ans+=x*m;
    j+=pre[i];
    fcw.update(pre[i],pre[i],1);
  }
  cout<<ans<<endl;
}
signed main(){
  cin.tie(0)->sync_with_stdio(0);
  //freopen("D://321//in.txt","r",stdin);
  //freopen("D://321//out.txt","w",stdout);
  int _=1;
  //cin>>_;
  while(_--)
  solve();
  return 0;
}

回复

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

正在加载回复...