fhq没过样例求调
查看原帖
fhq没过样例求调
749175
114514xxx楼主2025/2/5 19:38
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+25;
struct FHQtreap{
    struct node{
        int val,siz;
        int lson,rson;
        int pri;
    }treap[N];
    int usize,root;
    inline void update(int u){
        treap[u].siz=treap[treap[u].lson].siz+treap[treap[u].rson].siz+1;
    }
    inline void split(int u,int x,int &L,int &R){
        if(!u){L=R=0;return;}
        if(treap[u].val<=x)L=u,split(treap[u].rson,x,treap[u].rson,R);
        else R=u,split(treap[u].lson,x,L,treap[u].lson);
        update(u);
        return;
    }
    inline int merge(int a,int b){
        if(!a||!b)return a+b;
        if(treap[a].pri>treap[b].pri){
            treap[a].rson=merge(treap[a].rson,b);
            update(a);
            return a;
        }else{
            treap[b].lson=merge(a,treap[b].lson);
            update(b);
            return b;
        }
    }
    inline void mknew(int x){
        ++usize;
        treap[usize].val=x;
        treap[usize].pri=rand();
        treap[usize].siz=1;
    }
    inline void insert(int x){
        int L,R;
        split(root,x,L,R);
        mknew(x);
        root=merge(merge(L,usize),R);
    }
    inline int kth(int u,int rnk){
        if(rnk==treap[treap[u].lson].siz+1)return u;
        if(treap[treap[u].lson].siz>=rnk)return kth(treap[u].lson,rnk);
        else return kth(treap[u].rson,rnk-treap[treap[u].lson].siz-1);
    }
    inline int getpre(int x){
        int L,R;
        split(root,x-1,L,R);
        int res=treap[kth(L,treap[L].siz)].val;
        root=merge(L,R);
        return res;
    }
    inline int getnext(int x){
        int L,R;
        split(root,x,L,R);
        int res=treap[kth(R,1)].val;
        root=merge(L,R);
        return res;
    }
}t;
int n,x,ans;
int main(){
    srand(time(0));
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>x;
        if(i==1){ans+=x;t.insert(x);}
        else {
            int p1=t.getnext(x);
            int p2=t.getpre(x);
            ans+=min(abs(p1-x),abs(p2-x));
            t.insert(x);
        }
    }
    cout<<ans;
}

2025/2/5 19:38
加载中...