HDU 1512 Monkey King
2016-07-01 09:59
260 查看
左偏树。我是ziliuziliu,我是最强的
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #define maxn 100500 using namespace std; int root[maxn],ls[maxn],rs[maxn],val[maxn],father[maxn],n,m; int x,y,dis[maxn]; int find(int x) { if (x!=father[x]) father[x]=find(father[x]); return father[x]; } int merge(int x,int y) { if (x==0) return y; else if (y==0) return x; if (val[x]<val[y]) swap(x,y); rs[x]=merge(rs[x],y); father[rs[x]]=x; if (dis[ls[x]]<dis[rs[x]]) swap(ls[x],rs[x]); if (rs[x]==0) dis[x]=0; else dis[x]=dis[rs[x]]+1; return x; } int pop(int x) { father[x]=x; father[ls[x]]=ls[x]; father[rs[x]]=rs[x]; int regis=merge(ls[x],rs[x]); ls[x]=rs[x]=dis[x]=0; return regis; } int main() { while (scanf("%d",&n)!=EOF) { memset(ls,0,sizeof(ls)); memset(rs,0,sizeof(rs)); dis[0]=-1; for (int i=1;i<=n;i++) { scanf("%d",&val[i]); father[i]=i; root[i]=i; } scanf("%d",&m); for (int i=1;i<=m;i++) { scanf("%d%d",&x,&y); int pa,pb; pa=find(x),pb=find(y); if (pa==pb) printf("-1\n"); else { val[pa]/=2;val[pb]/=2; int nn1,nn2; nn1=pop(pa);nn2=pop(pb); nn1=merge(nn1,pa); nn1=merge(nn1,pb); nn1=merge(nn1,nn2); printf("%d\n",val[find(pa)]); } } } return 0; }
相关文章推荐
- 异步本身不会超时 报错
- 异步本身不会超时 报错
- Ubuntu 16.04安装 PeaZip 6.0.3档案管理器
- 集结乐电脑管家 v6.5.0.0官方版
- NFV驶入快车道: 核心网率先“漫步云端”
- iOS App开发:最好的设计和开发工具
- NGUI 背包系统的拖拽
- db2 远程客户机(client)连接
- 交换左右子树
- Android学习笔记十六之FrameLayout框架布局
- presto-elasticsearch connector
- jquery插件省市三级联动
- spring 8 bean配置--IOC容器中bean的生命周期
- 我的新博客
- RecyclerView--GridLayoutManager设置某个item占据的列数
- Exchange2010升级到2016——配置Exchange2016SCP、Anywhere配置、证书
- 编辑距离算法详解:Levenshtein Distance算法
- JAVA读取本地txt文件
- 10分钟 搞定JS和iOS的交互
- 从intellij转as的一个问题