hdu 1512 Monkey King
2016-02-11 13:07
375 查看
#include <cstdio> #include <iostream> #include <algorithm> #include <cstring> #include <cmath> #include <queue> #include <vector> using namespace std; #define N 100010 int n,m; int fa ; struct Node{ int l,r,dist,value; }t ; inline int read() { int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch<='9'&&ch>='0'){x=x*10+ch-'0';ch=getchar();} return x*f; } int Find(int x) { if(x!=fa[x])fa[x]=Find(fa[x]); return fa[x]; } int Merge(int a,int b) { if(!a||!b) return a+b; if(t[a].value<t[b].value) swap(a,b); t[a].r=Merge(t[a].r,b); fa[t[a].r]=a; if(t[t[a].l].dist<t[t[a].r].dist) swap(t[a].l,t[a].r); if(t[a].r==0) t[a].dist=0; else t[a].dist=t[t[a].r].dist+1; return a; } int Del_root(int x) { int left=t[x].l,right=t[x].r; fa[left]=left;fa[right]=right; t[x].l=t[x].r=t[x].dist=0; return Merge(left,right); } int main() { while(scanf("%d",&n)!=EOF) { memset(t,0,sizeof(t)); t[0].dist=-1; for(int i=1;i<=n;i++) { t[i].value=read(); fa[i]=i; } m=read(); for(int i=1;i<=m;i++) { int x=read(),y=read(); int root1=Find(x),root2=Find(y); if(root1==root2) { printf("-1\n"); continue; } int t1=Del_root(root1),t2=Del_root(root2); t[root1].value/=2;t[root2].value/=2; t1=Merge(t1,root1); t2=Merge(t2,root2); printf("%d\n",t[Merge(t1,t2)].value); } } return 0; }
相关文章推荐
- [BZOJ4300] 绝世好题
- poj 3984迷宫问题(bfs加打印路径)
- 最新 Sublime Text3 激活码 (Build 3103 有效)
- 生产环境 JDK6 升级 JDK8
- pyhon3.4 requests模块模拟post登陆csdn
- ListView适配器和监听器
- 8.Masonry的使用方法
- mongodb搭建校内搜索引擎——网页文本的规范化
- 杭电1495 非常可乐(bfs)
- 如何以非 root 用户将应用绑定到 80 端口-ssh 篇
- Vmware 虚拟机下安装ubuntu14 操作系统
- 使用Eclipse基于Maven使用Java开发WordCount程序项目
- Java引用机制——reference
- hdu4521小明系列问题——小明序列【最长上升子序列,间隔】
- 队列的基本操作
- UVA 11374 - Airport Express(最短路)
- POJ 3684_Physics Experiment
- POJ 3684_Physics Experiment
- 一些软件的设计原则
- node中使用domain处理异步异常问题