有旋treap10pts,AC#10,#11
查看原帖
有旋treap10pts,AC#10,#11
749175
114514xxx楼主2024/11/5 19:31
#include<bits/stdc++.h>
#define int long long
#define ls t[p].l
#define rs t[p].r
using namespace std;
const int inf=4e18;
const int N=1e6+25;
struct treap{
    int l,r;
    int cnt,siz;
    int val,dat;
}t[N];
map<int,int>mp;
int tot,root,n,x;
inline void update(int &p){
    t[p].siz=t[ls].siz+t[rs].siz+t[p].cnt;
}
inline void New(int val){
    t[++tot].cnt=1;
    t[tot].val=val;
    t[tot].siz=1,t[tot].dat=rand();
    update(tot);
}
inline void zig(int &p){
    int q=t[p].l;
    t[p].l=t[q].r,t[q].r=p,p=q;
    update(rs),update(p);
}
inline void zag(int &p){
    int q=t[p].r;
    t[p].r=t[q].l,t[q].l=p,p=q;
    update(ls),update(p);
}
inline void build(){
    New(-inf),New(inf);
    root=1;t[root].r=2;
    update(root);
}
inline void Insert(int &p,int val){
    if(!p){
        New(val);
        return;
    }
    if(val==t[p].val){
        t[p].cnt++;
        update(p);
        return;
    }
    if(val<t[p].val){
        Insert(ls,val);
        if(t[p].dat<t[ls].dat)zig(p);
    }else{
        Insert(rs,val);
        if(t[p].dat<t[rs].dat)zag(p);
    }
    update(p);
    return;
}
inline int getpre(int val){
    int p=root,ans=1;
    while(p){
        if(t[p].val==val){
            if(t[p].l){
                p=t[p].l;
                while(t[p].r)p=t[p].r;
                ans=p;
            }
            break;
        }
        if(t[p].val<val&&t[p].val>t[ans].val)ans=p;
        p=val<t[p].val?t[p].l:t[p].r;
    }
    return t[ans].val;
}
inline int getnext(int val){
    int p=root,ans=2;
    while(p){
        if(t[p].val==val){
            if(t[p].r){
                p=t[p].r;
                while(t[p].l>0)p=t[p].l;
                ans=p;
            }
            break;
        }
        if(t[p].val>val&&t[p].val<t[ans].val)ans=p;
        p=val<t[p].val?t[p].l:t[p].r;
    }
    return t[ans].val;
}
int sum=0;
signed main(){
    srand(time(0));
    srand(rand());
    cin>>n;
    mp.clear();
    for(int i=1;i<=n;i++){
        cin>>x;
        if(i==1){
            Insert(root,x);
            sum+=x;
            mp[x]++;
        }
        if(i==2){
            sum=sum+abs(sum-x);
            Insert(root,x);
            mp[x]++;
            continue;
        }
        if(i>2){
            if(mp[x]){
                Insert(root,x);
                continue;
            }
            int x1=getpre(x);
            int x2=getnext(x);
            mp[x]++;
            sum+=min(abs(x1-x),abs(x2-x));
            Insert(root,x);
        }
    }
    cout<<sum;
    return 0;
}

2024/11/5 19:31
加载中...