HDU 1512 Monkey King 左偏树
来源:互联网 发布:阿里云 cdn 加速域名 编辑:程序博客网 时间:2024/04/30 15:29
左偏树入门题
#include <iostream>#include <string.h>#include <algorithm>#include <stdio.h>#include <math.h>#include <queue>using namespace std;const int N = 100005;struct node{ int l, r, dis, key;}tree[N];int n, m;int fa[N];int find(int x){ if(x != fa[x]) return fa[x] = find(fa[x]); return fa[x];}int merge(int a, int b){ if(!a) return b; if(!b) return a; if(tree[a].key < tree[b].key) swap(a, b); tree[a].r = merge(tree[a].r, b); fa[tree[a].r] = a; if(tree[tree[a].l].dis < tree[tree[a].r].dis) swap(tree[a].l, tree[a].r); if(tree[a].r) tree[a].dis = tree[tree[a].l].dis + 1; else tree[a].dis = 0; return a;}int pop(int x){ int l = tree[x].l; int r = tree[x].r; fa[l] = l; fa[r] = r; tree[x].l = tree[x].r = tree[x].dis = 0; return merge(l, r);}int main(){ while(scanf("%d", &n) != EOF) { for(int i = 1; i <= n; i++) { scanf("%d", &tree[i].key); tree[i].l = tree[i].r = tree[i].dis = 0; fa[i] = i; } scanf("%d", &m); while(m--) { int u, v; scanf("%d %d", &u, &v); int x = find(u); int y = find(v); if(x == y) printf("-1\n"); else { u = pop(x); v = pop(y); tree[x].key /= 2; tree[y].key /= 2; u = merge(u, x); v = merge(v, y); u = merge(u, v); printf("%d\n", tree[u].key); } } }}
0 0
- hdu 1512 Monkey King 左偏树
- hdu 1512Monkey King 左偏树
- HDU 1512 Monkey King 左偏树
- hdu 1512 Monkey King 左偏树
- 【HDU】1512 Monkey King 左偏树
- HDU 1512 Monkey King(左偏树)
- 左偏树 Monkey King HDU-1512
- hdu 1512 Monkey King
- 【HDU 1512】Monkey King
- hdu 1512 Monkey King
- HDU 1512 Monkey King
- HDU 1512 Monkey King
- HDU-1512-Monkey King
- Hdu 1512 Monkey King 左偏树 解题报告
- HDU 1512 Monkey King(左偏树)
- HDU 1512 Monkey King(左偏堆)
- [hdu-1512]Monkey King 题解
- HDU Monkey King(左偏树)
- ActivieMQ入门
- Netty解决粘包拆包问题
- 微信中获取部门成员信息
- Node.js单线程
- HDU 2966 In case of failure KD树
- HDU 1512 Monkey King 左偏树
- URAL1004 Sightseeing Trip Floyd 最小环
- URAL1076.Trash 二分图完美匹配
- HDU 1402 A * B Problem Plus FFT
- 《LoadRunner 没有告诉你的》之三——理发店模型
- fork()后父子进程的地址空间
- Permutation Bo
- 在OpenSSL中添加自定义加密算法
- hdoj-2674-N!Again