洛谷P1456 (HDU 1512)Monkey King
来源:互联网 发布:淘宝企业店铺装修教程 编辑:程序博客网 时间:2024/05/18 00:17
左偏树
洛谷题目传送门
HDU题目传送门
题目大意:
每次取出两个大根堆的对顶,将这两个节点的值减半并重新加入堆中,然后将这两个大根堆合并起来,输出堆顶的值。(转自wyxdalao 我太懒了)
既然要满足堆的性质,又要支持合并,于是可以想到使用左偏树。顿时这道题就这么解决了#(滑稽)
注意多组数据。
代码:
#include<cstdio>#include<cstring>#include<algorithm>#define MAXN 100000using namespace std;struct node{ int ls,rs; int v,dis;};int n,m;node a[MAXN+5];int fa[MAXN+5];inline char readc(){ static char buf[100000],*l=buf,*r=buf; if (l==r) r=(l=buf)+fread(buf,1,100000,stdin); if (l==r) return EOF; return *l++;}inline int _read(){ int num=0; char ch=readc(); while (ch<'0'||ch>'9') { if (ch==EOF) return -1; ch=readc(); } while (ch>='0'&&ch<='9') { num=num*10+ch-48; ch=readc(); } return num;}int findfather(int x){ while (fa[x]) x=fa[x]; return x;}int merge(int x,int y){ if (x*y==0) return x+y; if (a[x].v<a[y].v) swap(x,y); a[x].rs=merge(a[x].rs,y); fa[a[x].rs]=x; if (a[a[x].ls].dis<a[a[x].rs].dis) swap(a[x].ls,a[x].rs); a[x].dis=a[a[x].rs].dis+1; return x;}int main(){ while (n=_read(),n!=-1){ memset(a,0,sizeof(a)); memset(fa,0,sizeof(fa)); for (int i=1;i<=n;i++) a[i].v=_read(); m=_read(); for (int i=1;i<=m;i++){ int x=_read(),y=_read(); int fx=findfather(x),fy=findfather(y); if (fx==fy) printf("-1\n"); else{ fa[a[fx].ls]=fa[a[fx].rs]=fa[a[fy].ls]=fa[a[fy].rs]=0; int l=merge(a[fx].ls,a[fx].rs),r=merge(a[fy].ls,a[fy].rs); int now=merge(l,r); a[fx].ls=a[fx].rs=0; a[fx].v/=2; now=merge(now,fx); a[fy].ls=a[fy].rs=0; a[fy].v/=2; now=merge(now,fy); printf("%d\n",a[now].v); } } } return 0;}
阅读全文
1 0
- 洛谷P1456 (HDU 1512)Monkey King
- 【洛谷P1456】Monkey King
- 洛谷 P1456 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 1512Monkey King 左偏树
- HDU 1512 Monkey King 左偏树
- hdu 1512 Monkey King 左偏树
- HDU 1512 Monkey King(左偏堆)
- 【HDU】1512 Monkey King 左偏树
- HDU 1512 Monkey King(左偏树)
- JAVA jvm和 Android dvm的区别
- 深度揭秘原型(深浅克隆)模式!
- 018 连续函数的运算及初等函数的连续性;第一类间断点、第二类间断点
- HNU OJ题库 1007H生理周期
- POJ 1961 Period
- 洛谷P1456 (HDU 1512)Monkey King
- E
- zynq学习笔记二:编译U-Boot(zybo)
- [BZOJ]1093: [ZJOI2007]最大半连通子图 Tarjan缩点+拓扑图DP
- 第四周项目二C/C++建设“单链表”算法库
- 计算机的二进制规则
- GitHub Hello world中文教程
- Introduction to D3
- ViewDragHelper