题目:http://acm.hdu.edu.cn/showproblem.php?pid=1512

很简单的左偏树;

但突然对 rt 的关系感到混乱,改了半天才弄对;

注意是多组数据!

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int const maxn=1e5+;
int n,m,s[maxn],rt[maxn],ls[maxn],rs[maxn],dis[maxn];
int find(int x){while(rt[x])x=rt[x]; return x;}
int merge(int x,int y)
{
if(!x||!y)return x+y;
if(s[x]<s[y])swap(x,y);
rs[x]=merge(rs[x],y);
rt[rs[x]]=x;
if(dis[ls[x]]<dis[rs[x]])swap(ls[x],rs[x]);
if(rs[x])dis[x]=dis[rs[x]]+;
else dis[x]=;
// rt[rs[x]]=rt[ls[x]]=x;
return x;
}
void clr(int x){rt[x]=; rs[x]=; ls[x]=;}
int main()
{
while(~scanf("%d",&n))
{
for(int i=;i<=n;i++)scanf("%d",&s[i]),ls[i]=rs[i]=dis[i]=rt[i]=;
scanf("%d",&m);
for(int i=,x,y,u,v,t1,t2;i<=m;i++)
{
scanf("%d%d",&x,&y);
u=find(x); v=find(y);
if(u==v){printf("-1\n"); continue;}
rt[ls[u]]=; rt[rs[u]]=; rt[ls[v]]=; rt[rs[v]]=; //!
t1=merge(ls[u],rs[u]);
t2=merge(ls[v],rs[v]);
clr(u); clr(v);//!
s[u]>>=; s[v]>>=;
merge(u,t1); merge(v,t2);
printf("%d\n",s[merge(find(u),find(v))]);//find()
}
}
return ;
}

还可以把 rt 当并查集用,因为并查集实际上也是树,似乎更简洁;

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int const maxn=1e5+;
int n,m,s[maxn],rt[maxn],ls[maxn],rs[maxn],dis[maxn];
int find(int x){return rt[x]==x?x:rt[x]=find(rt[x]);}
int merge(int x,int y)
{
if(!x||!y)return x+y;
if(s[x]<s[y])swap(x,y);
rs[x]=merge(rs[x],y);
rt[rs[x]]=x;
if(dis[ls[x]]<dis[rs[x]])swap(ls[x],rs[x]);
if(rs[x])dis[x]=dis[rs[x]]+;
else dis[x]=;
// rt[rs[x]]=rt[ls[x]]=x;
return x;
}
int del(int x)
{
int l=ls[x],r=rs[x];
rt[l]=l; rt[r]=r;
ls[x]=rs[x]=dis[x]=;
return merge(l,r);
}
int main()
{
while(~scanf("%d",&n))
{
for(int i=;i<=n;i++)scanf("%d",&s[i]),rt[i]=i,ls[i]=rs[i]=dis[i]=;
scanf("%d",&m);
for(int i=,x,y,u,v,t1,t2;i<=m;i++)
{
scanf("%d%d",&x,&y);
u=find(x); v=find(y);
if(u==v){printf("-1\n"); continue;}
s[u]>>=; t1=del(u),t1=merge(u,t1);
s[v]>>=; t2=del(v),t2=merge(v,t2);
printf("%d\n",s[merge(t1,t2)]);//find()
}
}
return ;
}

hdu 1512 Monkey King —— 左偏树的更多相关文章

  1. hdu 1512 Monkey King 左偏树

    题目链接:HDU - 1512 Once in a forest, there lived N aggressive monkeys. At the beginning, they each does ...

  2. HDU 1512 Monkey King (左偏树+并查集)

    题意:在一个森林里住着N(N<=10000)只猴子.在一开始,他们是互不认识的.但是随着时间的推移,猴子们少不了争斗,但那只会发生在互不认识 (认识具有传递性)的两只猴子之间.争斗时,两只猴子都 ...

  3. HDU 1512 Monkey King ——左偏树

    [题目分析] 也是堆+并查集. 比起BZOJ 1455 来说,只是合并的方式麻烦了一点. WA了一天才看到是多组数据. 盲人OI (- ̄▽ ̄)- Best OI. 代码自带大常数,比启发式合并都慢 [ ...

  4. HDU 1512 Monkey King(左偏堆)

    爱争吵的猴子 ★★☆ 输入文件:monkeyk.in 输出文件:monkeyk.out 简单对比 时间限制:1 s 内存限制:128 MB [问题描述] 在一个森林里,住着N只好斗的猴子.开始,他们各 ...

  5. ZOJ2334 Monkey King 左偏树

    ZOJ2334 用左偏树实现优先队列最大的好处就是两个队列合并可以在Logn时间内完成 用来维护优先队列森林非常好用. 左偏树代码的核心也是两棵树的合并! 代码有些细节需要注意. #include&l ...

  6. zoj 2334 Monkey King/左偏树+并查集

    原题链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1389 大致题意:N只相互不认识的猴子(每只猴子有一个战斗力值) 两只 ...

  7. HDU1512 ZOJ2334 Monkey King 左偏树

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - ZOJ2334 题目传送门 - HDU1512 题意概括 在一个森林里住着N(N<=10000)只猴子. ...

  8. hdu1512 Monkey King(左偏树 + 并查集)

    Once in a forest, there lived N aggressive monkeys. At the beginning, they each does things in its o ...

  9. LuoguP1456 Monkey King (左偏树)

    struct LeftTree{ int l,r,val,dis; }t[N]; int fa[N]; inline int Find(int x){ return x == fa[x] ? x : ...

随机推荐

  1. HDU多校Round 5

    Solved:3 rank:71 E. Everything Has Changed #include <bits/stdc++.h> using namespace std; const ...

  2. extjs动态插入一列

    StdDayWordQuery:function(btn,event){ var form=Ext.getCmp('queryFormSDW'); var userNameORuserCode = f ...

  3. cc.Node—场景树

    对于cc.Node我分了四个模块学习: 1.场景树,2.事件响应,3.坐标系统,4.Action的使用:在此记录经验分享给大家. 场景树 1: creator是由一个一个的游戏场景组成,通过代码逻辑来 ...

  4. Servlet过滤器的使用

    Servlet过滤器的使用 制作人:全心全意 Servlet过滤器:Servlet过滤器与Servlet十分相似,但它具有拦截客户端请求的功能,Servlet过滤器可以改变请求中的内容,来满足实际开发 ...

  5. LearnPython笔记:ex48 代码

    赶紧写上 ,一定有人着急要看,啊哈哈哈哈,嘻嘻 哈哈 不枉我起了个大早 利用什么碎片时间啊,真正能深入学习的,是需要大段大段不被打断的时间 1. 完全实现了如下几种输入数据: 2. 遗留:最后一个el ...

  6. Python学习之前

    编程语言的分类: 1.机器语言:直接以0和1编写指令代码,计算机能直接识别处理: 特点:运行速度最快,太复杂,开发效率低,可执行操作最多. 2.汇编语言:本质上依然是机器语言,用英文代替0和1,更容易 ...

  7. 【转】sizeof()用法总结

    传送门:https://blog.csdn.net/u011677209/article/details/52837065

  8. 复习1背包dp

    背包问题是对于一个有限制的容器,一般计算可以装的物品的价值最值或数量.通常每个物品都有两个属性空间和价值,有时还有数量或别的限制条件,这个因体而异. 背包大概分成3部分,下面会细述这最经典的3种题型 ...

  9. kendo grid 点击新增没有反映

    在datasource中缺少 editable: "inline",这一行

  10. HDFS v1.0学习笔记

    hdfs是一个用于存储大文件的分布式文件系统,是apache下的一个开源项目,使用java实现.它的设计目标是可以运行在廉价的设备上,运行在大多数的系统平台上,高可用,高容错,易于扩展. 适合场景 存 ...