【HDOJ】【1512】Monkey King
2015-03-15 19:14
204 查看
数据结构/可并堆
啊……换换脑子就看了看数据结构……看了一下左偏树和斜堆,鉴于左偏树不像斜堆可能退化就写了个左偏树。左偏树介绍:http://www.cnblogs.com/crazyac/articles/1970176.html
体会:合并操作是可并堆的核心操作(就像LCT里的access),进堆和弹堆顶都是直接调用合并操作实现的。
而合并的实现是一个递归的过程:将小堆与大堆的右儿子合并(这里的大小指的是堆顶元素的大小),直到某个为0。(是不是有点启发式合并的感觉……)
在合并的过程中要维护堆的形态:如果右儿子长度(或者叫深度?)大于左儿子,那就交换左右儿子。也就是说:每次要生长的时候,总是让短的一侧先生长,那么这个堆,最后就能够比较对称。
//HDOJ 1512 #include<vector> #include<cstdio> #include<cstring> #include<cstdlib> #include<iostream> #include<algorithm> #define rep(i,n) for(int i=0;i<n;++i) #define F(i,j,n) for(int i=j;i<=n;++i) #define D(i,j,n) for(int i=j;i>=n;--i) #define pb push_back using namespace std; inline int getint(){ int v=0,sign=1; char ch=getchar(); while(ch<'0'||ch>'9'){ if (ch=='-') sign=-1; ch=getchar();} while(ch>='0'&&ch<='9'){ v=v*10+ch-'0'; ch=getchar();} return v*sign; } const int N=1e6+10,INF=~0u>>2; typedef long long LL; /******************tamplate*********************/ int n,m; struct node{ int v,l,r,dis,f; node(int v=0,int l=0,int r=0,int dis=0,int f=0): v(v),l(l),r(r),dis(dis),f(f){} void out(){ printf("%d %d %d %d %d\n",v,l,r,dis,f); } }; struct Left_tree{ node t ; int merge(int x,int y){ if (x==0) return y; if (y==0) return x; if (t[x].v<t[y].v) swap(x,y); t[x].r=merge(t[x].r,y); t[t[x].r].f=x; if (t[t[x].l].dis<t[t[x].r].dis) swap(t[x].l,t[x].r); if (t[x].r==0) t[x].dis=0; else t[x].dis=t[t[x].r].dis+1; return x; } int pop(int x){ int l=t[x].l,r=t[x].r; t[l].f=l; t[r].f=r; t[x].l=t[x].r=t[x].dis=0; return merge(l,r); } int find(int x){return t[x].f==x ? x : find(t[x].f);} void init(){ int x=0; F(i,1,n){ x=getint(); t[i]=node(x); t[i].f=i; } } void solve(){ m=getint(); int x,y; F(i,1,m){ x=getint(); y=getint(); int f1=find(x),f2=find(y); if (f1==f2){puts("-1");continue;} int t1=pop(f1),t2=pop(f2); t[f1].v/=2; t1=merge(t1,f1); t[f2].v/=2; t2=merge(t2,f2); t1=merge(t1,t2); printf("%d\n",t[t1].v); } } }heap; int main(){ #ifndef ONLINE_JUDGE freopen("1512.in","r",stdin); freopen("1512.out","w",stdout); #endif while(scanf("%d",&n)!=EOF){ heap.init(); heap.solve(); } return 0; }
View Code
相关文章推荐
- 左偏树-HDOJ-1512-Monkey King
- HDOJ 1512 Monkey King(左偏树)
- HDOJ 1512 Monkey King -- 左偏树
- HDU 1512 HDOJ 1512 Monkey King ( 左偏树 ) ACM 1512 IN HDU
- 【HDOJ】1512 Monkey King
- hdu 1512 Monkey King (左偏树 可并堆)
- 洛谷P1456 (HDU 1512)Monkey King
- 1512 Monkey King
- HDU 1512 Monkey King 并查集+左偏树
- HDU 1512 Monkey King [可并堆]
- HDU 1512 Monkey King
- Hdu 1512 Monkey King(左偏树+并查集)
- HDU-1512-Monkey King
- 【左偏树】HDU1512-Monkey King
- 【HDU 1512】Monkey King
- hdu 1512 Monkey King
- 【HDU】1512 Monkey King 左偏树
- hdu 1512 Monkey King(坑)
- hdu1512-Monkey King- 左偏树+并查集
- hdu 1512 Monkey King 左偏树(可并堆)