一个卡常方法
查看原帖
一个卡常方法
622711
ax_by_c楼主2025/6/28 08:37
ll Q(const int &l,const int &r){
    if(col[l]==col[r]){
        ll ans=suf[l];
        if(r!=br[col[l]])ans-=suf[r+1];
        for(int i=1,pc=0;i<=br[col[l]]-bl[col[l]]+1;i++){
            ans-=(l<=as[col[l]][i]&&as[col[l]][i]<=r)?(pc):(0);
            pc+=(r<as[col[l]][i])?(1):(0);
        }
        return ans;
    }
    ll ans=suf[l]+pre[r]+res[col[l]+1][col[r]-1];
    rep(i,l,br[col[l]])ans+=cnt[col[r]-1][a[i]]-cnt[col[l]][a[i]];
    rep(i,bl[col[r]],r)ans+=br[col[r]-1]-bl[col[l]+1]+1-cnt[col[r]-1][a[i]]+cnt[col[l]][a[i]];
    for(int i=1,j=1,pc=0;i<=br[col[l]]-bl[col[l]]+1;i++){
        while(j<=br[col[r]]-bl[col[r]]+1&&a[as[col[l]][i]]>=a[as[col[r]][j]]){
            pc+=(as[col[r]][j]<=r)?(1):(0);
            j++;
        }
        ans+=(l<=as[col[l]][i])?(pc):(0);
    }
    return ans;
}
ll Q(const int &l,const int &r){
    int pll=bl[col[l]],plr=bl[col[r]],prl=br[col[l]],prr=br[col[r]];
    if(col[l]==col[r]){
        ll ans=suf[l];
        if(r!=prl)ans-=suf[r+1];
        for(int i=1,pc=0;i<=prl-pll+1;i++){
            ans-=(l<=as[col[l]][i]&&as[col[l]][i]<=r)?(pc):(0);
            pc+=(r<as[col[l]][i])?(1):(0);
        }
        return ans;
    }
    ll ans=suf[l]+pre[r]+res[col[l]+1][col[r]-1];
    rep(i,l,prl)ans+=cnt[col[r]-1][a[i]]-cnt[col[l]][a[i]];
    rep(i,plr,r)ans+=br[col[r]-1]-bl[col[l]+1]+1-cnt[col[r]-1][a[i]]+cnt[col[l]][a[i]];
    for(int i=1,j=1,pc=0;i<=prl-pll+1;i++){
        while(j<=prr-plr+1&&a[as[col[l]][i]]>=a[as[col[r]][j]]){
            pc+=(as[col[r]][j]<=r)?(1):(0);
            j++;
        }
        ans+=(l<=as[col[l]][i])?(pc):(0);
    }
    return ans;
}

下面比上面跑得快,大概是因为访问内存比较慢?

2025/6/28 08:37
加载中...