平衡树求改错
查看原帖
平衡树求改错
181715
gjh303987897楼主2022/3/8 20:03
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
inline int read(){
    int x=0,f=1; char ch=getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-') f=-1;
        ch=getchar();
    }
    while(ch<='9'&&ch>='0'){
        x=(x<<3)+(x<<1)+(ch^48);
        ch=getchar();
    }
    return x*f;
}
// find a pre and a last in bst
//nlongn for every n is o(n) and find a best close is o(longn) by using bst
struct data{
    int c;//union
    int size;
    int w;//rand
    int lc,rc;
    int v;
}t[1000001];
int root,k,js;
void treap_r(int &k){
    int son1=t[k].lc; int son2=t[son1].rc;
    t[k].lc=son2; t[son1].rc=k;
    t[son1].size=t[k].size; t[k].size=t[t[k].rc].size+t[son2].size+t[k].c;
    k=son1;
}
void treap_l(int &k){
    int son1=t[k].rc; int son2=t[son1].lc;
    t[k].rc=son2; t[son1].lc=k;
    t[son1].size=t[k].size; t[k].size=t[t[k].lc].size+t[son2].size+t[k].c;
    k=son1;
}
void insert(int &k,int n){
    if(!k){
        k=++js; t[k].lc=t[k].rc=0; t[k].c=t[k].size=1;
        t[k].w=rand(); t[k].v=n; return ;
    }
    if(t[k].v==n){
        t[k].c++; return;
    }
    if(t[k].v>n){
        t[k].size++; insert(t[k].lc,n);
        if(t[t[k].lc].w<t[k].w) treap_l(k);
    }
    if(t[k].v<n){
        t[k].size++; insert(t[k].rc,n);
        if(t[t[k].rc].size<t[k].w) treap_r(k);
    }
}
int find_close_max(const int vi){
    int best=root,sc;
    while(best){
        if(t[best].v==vi){ return vi; }
        if(t[best].v>vi){
            best=t[best].lc; sc=t[best].v;
        }
        if(t[best].v<vi){ t[best].rc; }
    }
    return sc;
}
int find_close_min(const int vi){
    int best=root,pr;
        while(best){
        if(t[best].v<vi){
            best=t[best].rc; pr=t[best].rc;
        }
        if(t[best].v==vi){ return vi; }
        if(t[best].v>vi){ best=t[best].lc; }
    }
    return pr;
}
int main()
{
    long long ans=0;
    int n=read(); 
    for(int i=1;i<=n;i++){
        int s=read(); 
        if(i==1){
            ans+=s; insert(root,s); continue;
        } 
        ans+=min(abs(s-find_close_max(s)),abs(s-find_close_min(s)));
        insert(root,s);
    }
    cout<<ans;
    return 0;
}
2022/3/8 20:03
加载中...