左偏树 Monkey King HDU-1512
来源:互联网 发布:ubuntu关闭apache服务 编辑:程序博客网 时间:2024/04/30 08:40
原题:HDU-1512
大意:有n只猴子,两只猴子闹矛盾,分别派出两批猴子中最强壮的猴子打架,各自损失一半生命值,打完之后成一波,问每次打完最强壮的猴子的血量。
最开始用优先队列做的,n只猴子就n个优先队列,每次从队首取最强壮的猴子,打完之后再插进去,然后直接将两个优先队列合并就OK了,然后就...超内存了....
后来在网上看用左偏树做,第一次听说...日狗...
大致总结一下左偏树(此题取的是最大值,所以按最大值总结,当然最小值的话把 < 改成 > 就好了
1、左偏树的节点的值大于左右子节点的值 所以根节点的值是最大的,每次取一个左偏树的最大值只要取根节点就OK了
2、左偏树除了左右儿子、值还有一个距离参数dis,这个距离参数表示这个节点到外节点经历的边的数目,啥叫外节点呢?外节点就是没有左儿子或者没有右儿子的节点,
叶子节点不属于外节点。在一颗左偏树中,左儿子的距离要大于等于右儿子的距离。
3、外节点的距离为1,叶子节点的距离为0,空节点的距离为-1。其它节点的距离等于右儿子的距离+1。
4、左偏树的插入
然后这个题目就很好做了,每只猴子最开始都是一颗左偏树,打架的时候取出根节点,打完插回去再合并一下就OK了
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <queue>using namespace std;struct node { int l,r,v,dis;} mon[100005];int pre[100005];int n;int find(int t){ int i=t,j; while(t!=pre[t])t=pre[t]; while(i!=t){ j=pre[i]; pre[i]=t; i=j; } return t;}int insert(int i,int j){ if(i==0)return j; if(j==0)return i; if(mon[i].v<mon[j].v)swap(i,j); mon[i].r=insert(mon[i].r,j); pre[mon[i].r]=i; if(mon[mon[i].l].dis<mon[mon[i].r].dis) swap(mon[i].l,mon[i].r); if(mon[i].r) mon[i].dis=mon[mon[i].r].dis+1; else mon[i].dis=0; return i;}int pop(int i){ int x=mon[i].l,y=mon[i].r; pre[x]=x; pre[y]=y; mon[i].l=mon[i].r=mon[i].dis=0; return insert(x,y);}int main() { while(cin>>n) { for(int i=1; i<=n; i++) { cin>>mon[i].v; mon[i].l=mon[i].r=mon[i].dis=0; pre[i]=i; } cin>>n; int x,y; for(int i=1;i<=n;i++){ cin>>x>>y; int m1=find(x),m2=find(y); if(m1==m2){ cout<<"-1"<<endl; continue ; } int mm1=pop(m1); mon[m1].v/=2; mm1=insert(mm1,m1); int mm2=pop(m2); mon[m2].v/=2; mm2=insert(mm2,m2); cout<<mon[insert(mm1,mm2)].v<<endl; } } return 0;}
阅读全文
0 0
- hdu 1512 Monkey King 左偏树
- hdu 1512Monkey King 左偏树
- HDU 1512 Monkey King 左偏树
- hdu 1512 Monkey King 左偏树
- 【HDU】1512 Monkey King 左偏树
- HDU 1512 Monkey King(左偏树)
- 左偏树 Monkey King HDU-1512
- 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-1512]Monkey King 题解
- HDU Monkey King(左偏树)
- 文章标题
- Hibernate
- 最长公共子序列
- Mysql中使用explain进行性能分析
- GIT常用命令——入门必备
- 左偏树 Monkey King HDU-1512
- 7.规避脱离标准流的方法
- setsockopt中参数之SO_REUSEADDR的意义
- Hibernate的unsaved-value属性解读
- django 引用static templates
- socket网络通讯详细实现过程、解释
- 会场安排问题(贪心)
- C++之尽量少做转型动作(27)---《Effective C++》
- 阶乘之和