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
原创粉丝点击