萌新求助简单区间问题。
查看原帖
萌新求助简单区间问题。
455490
Sharpsmile楼主2024/1/23 16:34

莫队二次离线的板子寄掉了。

大佬帮帮 qwq

#include <iostream>
#include <cstdio>
#include <math.h>
#include <algorithm>
#include <istream>
#include <string>
#include <queue>
#include <deque>
#include <stack>
#include <set>
#include <string.h>
#include <map>
#include <unordered_map>
#include <sstream>
#include <bitset>
#include <cassert>
#include <random>
//#define int long long
#define double long double
#define endl "\n"
#define pii pair<double,int>
#define p1(x) ((x).first)
#define p2(x) ((x).second)
#define lc(x) ((x)<<1)
#define rc(x) ((x)<<1|1)
#define len(x) T[x].len
#define sum(x) T[x].sum
#define pre(x) T[x].pre
#define suf(x) T[x].suf
#define mx(x) T[x].mx
#define i128 __int128_t
using namespace std;
const int N=1e5;
const int SIZ=250;
const int LEN=N/SIZ+10;
int n,a[N+10],b[N+10];
long long f[N+10],h[N+10];
long long ANS[N+10];
int q;
int bel[N+10],L[LEN+10],R[LEN+10];

int t[N+10];
int S[LEN+10];
int suf[N+10],SUF[LEN+10],pre[N+10],PRE[LEN+10];
inline void clr(){
    memset(t,0,sizeof(t));
    memset(S,0,sizeof(S));
    memset(SUF,0,sizeof(SUF));
    memset(suf,0,sizeof(suf));
    memset(PRE,0,sizeof(PRE));
    memset(pre,0,sizeof(pre));
}
inline void rb(int id){
    suf[R[id]]=t[R[id]];
    for(int i=R[id]-1;i>=L[id];i--)
        suf[i]=suf[i+1]+t[i];
    pre[L[id]]=t[L[id]];
    for(int i=L[id]+1;i<=R[id];i++)
    pre[i]=pre[i-1]+t[i];
    
    S[id]=suf[L[id]];
    
    for(int i=LEN;i>=1;i--)
        SUF[i]=SUF[i+1]+S[i];
    for(int i=1;i<=LEN;i++)
        PRE[i]=PRE[i-1]+S[i];
}
inline void add(int x){
    t[x]++;
    rb(bel[x]);
}
inline int gsuf(int x){return SUF[bel[x]+1]+suf[x];}
inline int gpre(int x){return PRE[bel[x]-1]+pre[x];}
struct ASK{
    int l,r,id,s;
}A[N+10];
vector<ASK>TSUF[N+10],TPRE[N+10];
inline bool cmp(ASK A,ASK B){
    return bel[A.l]==bel[B.l]?bel[A.l]&1?A.r<B.r:A.r>B.r:A.l<B.l;
}
signed main(){
    ios::sync_with_stdio(0);
//    freopen("/Users/noip2019/Downloads/P5047_1.in","r",stdin);
//    freopen("b.out","w",stdout);
    memset(L,0x3f,sizeof(L));
    cin>>n>>q;
    for(int i=1;i<=n;i++)cin>>a[i],b[i]=a[i];
    for(int i=1;i<=N;i++)
        bel[i]=(i+SIZ-1)/SIZ,
        L[bel[i]]=min(L[bel[i]],i),
        R[bel[i]]=max(R[bel[i]],i);
    sort(b+1,b+n+1);
    auto tmp=unique(b+1,b+n+1);
    for(int i=1;i<=n;i++)a[i]=lower_bound(b+1,tmp,a[i])-b;
    for(int i=1;i<=n;i++)
        add(a[i]),f[i]=f[i-1]+gsuf(a[i]+1),h[i]=h[i-1]+gpre(a[i]-1);
    clr();
//    cout<<f[114]-f[113]<<" "<<h[114]-h[113]<<endl;
    for(int i=1;i<=q;i++){
        int l,r;
        cin>>l>>r;
        A[i]={l,r,i,0};
    }
    sort(A+1,A+q+1,cmp);
    int l=1,r=0;
    
    for(int i=1;i<=q;i++){
        if(r<A[i].r){
            ANS[A[i].id]+=f[A[i].r]-f[r];
            TSUF[l-1].push_back({r+1,A[i].r,A[i].id,-1});
            r=A[i].r;
        }
        if(l>A[i].l){
            TPRE[r].push_back({A[i].l,l-1,A[i].id,1});
            ANS[A[i].id]-=h[l-1]-h[A[i].l-1];
            l=A[i].l;
        }
        if(r>A[i].r){
            ANS[A[i].id]-=f[r]-f[A[i].r];
            TSUF[l-1].push_back({A[i].r+1,A[i].r,A[i].id,1});
            r=A[i].r;
        }
        if(l<A[i].l){
            TPRE[r].push_back({l,A[i].l-1,A[i].id,-1});
            ANS[A[i].id]+=h[A[i].l-1]-h[l-1];
            l=A[i].l;
        }
//        cout<<l<<" "<<r<<" "<<A[i].l<<" "<<A[i].r<<endl;
    }
    for(int i=0;i<=n;i++){
        if(i)add(a[i]);
        for(ASK A:TSUF[i]){
//            cout<<i<<" "<<A.l<<" "<<A.r<<endl;
            for(int j=A.l;j<=A.r;j++)
                ANS[A.id]+=A.s*gsuf(a[j]+1);}
        
        for(ASK A:TPRE[i]){
//            cout<<i<<" "<<A.l<<" "<<A.r<<endl;
            for(int j=A.l;j<=A.r;j++)
                ANS[A.id]+=A.s*gpre(a[j]-1);}
    }
    for(int i=1;i<=q;i++)
        ANS[A[i].id]+=ANS[A[i-1].id];
    for(int i=1;i<=q;i++)
        cout<<ANS[i]<<endl;
    cout.flush();
    return 0;
}
/*
*/



2024/1/23 16:34
加载中...