bzoj1588

一棵treap维护一下就可以了吧(压行导致代码格式不怎么美观)

#include<cstdio>
#include<cctype>
#include<cmath>
#include<algorithm>
#define maxn 32770
using namespace std;
struct data{int l,r,rnd,siz,key;data(){l=r=key=0;siz=1;};}tr[maxn];
int n,rt,tmp,siz;
long long ans;
void read(int &x){
    char ch=getchar();x=0;int f=1;
    while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
    while(isdigit(ch)){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
    x*=f;
}
void rturn(int &x){int tmp=tr[x].l;tr[x].l=tr[tmp].r;tr[tmp].r=x;tr[tmp].siz=tr[x].siz;tr[x].siz=tr[tr[x].l].siz+1+tr[tr[x].r].siz;x=tmp;}
void lturn(int &x){int tmp=tr[x].r;tr[x].r=tr[tmp].l;tr[tmp].l=x;tr[tmp].siz=tr[x].siz;tr[x].siz=tr[tr[x].l].siz+1+tr[tr[x].r].siz;x=tmp;}
void insert(int x,int &rt){
    if(!rt){rt=++siz;tr[siz].key=x;tr[siz].rnd=rand();return;}
    tmp=min(tmp,abs(x-tr[rt].key));
    if(x<tr[rt].key){tr[rt].siz++;insert(x,tr[rt].l);if(tr[tr[rt].l].rnd>tr[rt].rnd)rturn(rt);}
    else if(x>tr[rt].key){tr[rt].siz++;insert(x,tr[rt].r);if(tr[tr[rt].r].rnd>tr[rt].rnd);lturn(rt);}
}

int main(){
    read(n);int x;
    for(int i=1;i<=n;i++){
        read(x);tmp=1e9;insert(x,rt);
        ans+=(i==1?abs(x):tmp);
    }
    printf("%lld",ans);
}

猜你喜欢

转载自www.cnblogs.com/MikuKnight/p/9059355.html