题目: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 ;
}

最新文章

  1. 二、基于hadoop的nginx访问日志分析---计算日pv
  2. iOS_MJRefrash的详解以及使用
  3. OC第六节—— 继承与类别
  4. OBD 14230 Slow, Addr激活
  5. Lua学习笔记(四):表和数组
  6. shell基础——字符串处理(转载)
  7. 程序媛也会画图 之 在ubuntu下用GIMP制作gif
  8. 动作Action
  9. 通过chrome inspect 来调试手机hybird APP
  10. 个人作业3—个人总结(Alpha阶段)
  11. 网络通信 --&gt; 互联网协议(二)
  12. Centos常用命令之:正则表达式
  13. 如何上传代码到git上
  14. imp 导入以及换用户报错
  15. 中触发一个断点 其原因可能是堆被损坏,这说明 ***.exe 中或它所加载的任何 DLL 中有 Bug
  16. [android] 获取系统的联系人信息
  17. unit test
  18. hdu4276 依赖背包
  19. Spring Boot + Spring Cloud 实现权限管理系统 配置中心(Config、Bus)
  20. (转载)MySQl数据库-批量添加数据的两种方法

热门文章

  1. 关于iframe与$.load()哪个更好
  2. mysql服务无法启动(1067错误)时数据备份的经验
  3. libevent reference Mannual IV --Helper functions and types
  4. 洛谷 2574 XOR的艺术
  5. 如何创建新用户和授予MySQL中的权限
  6. Spring MVC学习总结(10)——Spring MVC使用Cors跨域
  7. 对百词斩&amp;可可英语的测试
  8. [luoguP2031] 脑力达人之分割字串(DP)
  9. 武大OJ 706.Farm
  10. MYSQL常用的字符串函数