hdu1512 左偏树(可并堆)

来源:互联网 发布:拍网络电影多少钱 编辑:程序博客网 时间:2024/05/29 18:37
#include <iostream>#include <cstring>#include <cstdio>#include<cmath>using namespace std;const int N= 1e5+10;typedef long long LL;struct node{    int l,r,dis,val,dad;}heap[N<<2];inline int max(const int &a,const int &b){    return a>b?a:b;}inline void swap(int &a,int &b){    a^=b^=a^=b;}inline int find(int &x){    return heap[x].dad==x?x:heap[x].dad=find(heap[x].dad);}int merge(int x,int y){    if(x==0) return y;    if(y==0) return x;    if(heap[x].val<heap[y].val) swap(x,y);    heap[x].r = merge(heap[x].r,y);    heap[heap[x].r].dad = x;    if(heap[heap[x].l].dis<heap[heap[x].r].dis) swap(heap[x].l,heap[x].r);    if(heap[x].r==0) heap[x].dis = 0;    else heap[x].dis = heap[heap[x].r].dis+1;    return x;}inline int pop(int &x){    int l = heap[x].l;    int r = heap[x].r;    heap[l].dad = l;    heap[r].dad = r;    heap[x].dis = heap[x].l = heap[x].r = 0;    return merge(l,r);}inline int push(int x,int y){    return merge(x,y);}int main(){    int num, que;    while(scanf("%d",&num)==1){        for(int i=1;i<=num;i++){            scanf("%d",&heap[i].val);            heap[i].l=heap[i].r=heap[i].dis=0;            heap[i].dad= i ;        }        scanf("%d",&que);        int a,b,x,y;        while(que--){            scanf("%d%d",&a,&b);            x = find(a);            y = find(b);            if(x==y) puts("-1");            else{                heap[x].val/=2;                int xx = pop(x);                xx = push(xx,x);                heap[y].val/=2;                int yy = pop(y);                yy = push(yy,y);                int tmp = merge(yy,xx);                printf("%d\n",heap[tmp].val);            }        }    }    return 0;}
0 0
原创粉丝点击