AVL平衡樹裸題(營業額統計)
阿新 • • 發佈:2019-02-08
#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); }