1. 程式人生 > >AVL平衡樹裸題(營業額統計)

AVL平衡樹裸題(營業額統計)

#include<iostream> 
#include<cstdio> 
#include<algorithm> 
#include<climits> 
   
const int MAXN=100000; 
using namespace std; 
struct node{int rc,lc,h,data;}tree[MAXN+5]; 
int n,t1,root,ans,cnt,M; 
   
inline void Get_int(int &Ret){ 
    char ch; 
    bool flag=0; 
    for(;ch=getchar(),ch<'0'||ch>'9';)if(ch=='-') flag=1; 
    for(Ret=ch-'0';ch=getchar(),ch>='0'&&ch<='9';Ret=Ret*10+ch-'0'); 
    flag&&(Ret=-Ret); 
} 
inline int zig(int i){ 
    int t=tree[i].lc; 
    tree[i].lc=tree[t].rc; 
    tree[t].rc=i; 
    tree[i].h=max(tree[tree[i].lc].h,tree[tree[i].rc].h)+1; 
    tree[t].h=max(tree[tree[t].lc].h,tree[tree[t].rc].h)+1; 
    return t; 
} 
inline int zag(int i){ 
    int t=tree[i].rc; 
    tree[i].rc=tree[t].lc; 
    tree[t].lc=i; 
    tree[i].h=max(tree[tree[i].lc].h,tree[tree[i].rc].h)+1; 
    tree[t].h=max(tree[tree[t].lc].h,tree[tree[t].rc].h)+1; 
    return t; 
} 
inline int zagzig(int i){ 
    tree[i].lc=zag(tree[i].lc); 
    return zig(i); 
} 
inline int zigzag(int i){ 
    tree[i].rc=zig(tree[i].rc); 
    return zag(i); 
} 
   
void Insert(int &tmp,int x){ 
    if(!tmp) 
    { 
        tree[++cnt].data=x; 
        tree[cnt].h=1; 
        tmp=cnt; 
        return; 
    } 
    M=min(abs(tree[tmp].data-x),M); 
    if(x<tree[tmp].data) 
    { 
        Insert(tree[tmp].lc,x); 
        if(tree[tree[tmp].lc].h==tree[tree[tmp].rc].h+2) 
        { 
            if(x<tree[tree[tmp].lc].data) tmp=zig(tmp); 
            else if(x>tree[tree[tmp].lc].data) tmp=zagzig(tmp); 
        } 
    } 
    else if(x>tree[tmp].data) 
    { 
        Insert(tree[tmp].rc,x); 
        if(tree[tree[tmp].rc].h==tree[tree[tmp].lc].h+2) 
        { 
            if(x>tree[tree[tmp].rc].data) tmp=zag(tmp); 
            else if(x<tree[tree[tmp].rc].data) tmp=zigzag(tmp); 
        } 
    } 
    tree[tmp].h=max(tree[tree[tmp].lc].h,tree[tree[tmp].rc].h)+1; 
} 
int main(){ 
    Get_int(n); Get_int(t1); 
    Insert(root,t1); 
    ans=t1; 
    for(int i=1;i<n;i++) 
    { 
        M=INT_MAX; 
        Get_int(t1); 
        Insert(root,t1); 
        ans+=M; 
    } 
    printf("%d",ans); 
}