思路:

左偏树里面掺了一些并查集的应用

这里放一份左偏树的代码模板

重点就是merge函数了……

int merge(int k1,int k2){
if(!k1||!k2)return k1+k2;
if(tr[k1].w<tr[k2].w)swap(k1,k2);
tr[k1].r=merge(tr[k1].r,k2);
if(tr[tr[k1].l].dis<tr[tr[k1].r].dis)swap(tr[k1].l,tr[k1].r);
tr[k1].dis=tr[tr[k1].r].dis+1;
return k1;
}

插入:合并原树和新节点。

删除最小值:合并左右子树。

删在某个地方的值:打个标记 以后用的时候再忽略

在这道题中 删的时候 找到左右子树 并查集变成它自己 再合并

//By SiriusRen
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 100050
int n,m,root[N],xx,yy,f[N];
struct Tree{int l,r,w,dis;void init(){l=r=dis=0;}}tr[N];
int find(int x){return x==f[x]?x:f[x]=find(f[x]);}
int merge(int k1,int k2){
if(!k1||!k2)return k1+k2;
if(tr[k1].w<tr[k2].w)swap(k1,k2);
tr[k1].r=merge(tr[k1].r,k2);
f[tr[k1].r]=k1;
if(tr[tr[k1].l].dis<tr[tr[k1].r].dis)swap(tr[k1].l,tr[k1].r);
tr[k1].dis=tr[tr[k1].r].dis+1;
return k1;
}
int pop(int x){
tr[x].w/=2;
int l=tr[x].l,r=tr[x].r;
f[l]=l,f[r]=r;
tr[x].init();
int t=merge(l,r);
return merge(x,t);
}
int main(){
while(~scanf("%d",&n)){
for(int i=1;i<=n;i++){
scanf("%d",&tr[i].w);
tr[i].init(),f[i]=i;
}
scanf("%d",&m);
for(int i=1;i<=m;i++){
scanf("%d%d",&xx,&yy);
int fx=find(xx),fy=find(yy);
if(fx==fy)puts("-1");
else{
int tx=pop(fx),ty=pop(fy);
printf("%d\n",tr[merge(tx,ty)].w);
}
}
}
}

HDU 1512 左偏树+并查集的更多相关文章

  1. 洛谷 - P1552 - 派遣 - 左偏树 - 并查集

    首先把这个树建出来,然后每一次操作,只能选中一棵子树.对于树根,他的领导力水平是确定的,然后他更新答案的情况就是把他子树内薪水最少的若干个弄出来. 问题在于怎么知道一棵子树内薪水最少的若干个分别是谁. ...

  2. 洛谷 - P3377 - 【模板】左偏树(可并堆) - 左偏树 - 并查集

    https://www.luogu.org/problemnew/show/P3377 左偏树+并查集 左偏树维护两个可合并的堆,并查集维护两个堆元素合并后可以找到正确的树根. 关键点在于删除一个堆的 ...

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

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=1512 [题目大意] 现在有 一群互不认识的猴子,每个猴子有一个能力值,每次选择两个猴子,挑出他们所 ...

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

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

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

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

  6. 【BZOJ 1455】 1455: 罗马游戏 (可并堆-左偏树+并查集)

    1455: 罗马游戏 Description 罗马皇帝很喜欢玩杀人游戏. 他的军队里面有n个人,每个人都是一个独立的团.最近举行了一次平面几何测试,每个人都得到了一个分数. 皇帝很喜欢平面几何,他对那 ...

  7. 【bzoj1455】【罗马游戏】左偏树+并查集(模板)

    Description 罗马皇帝很喜欢玩杀人游戏. 他的军队里面有n个人,每个人都是一个独立的团.最近举行了一次平面几何测试,每个人都得到了一个分数. 皇帝很喜欢平面几何,他对那些得分很低的人嗤之以鼻 ...

  8. bzoj 1455: 罗马游戏 左偏树+并查集

    1455: 罗马游戏 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 668  Solved: 247[Submit][Status] Descriptio ...

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

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

随机推荐

  1. linux常用命令技巧

    原文地址 这篇文章来源于Quroa的一个问答<What are some time-saving tips that every Linux user should know?>—— Li ...

  2. java用freemarker实现导出word----包含图片

    分为以下三个步骤: 1.先制作word模板 2.将该文档另存为 xml 文件 3.打开xml 文件 将对应的字段替换,比如 4.将xml文件保存成ftl格式的文档 5.相应的代码: package o ...

  3. [ML] Daily Portfolio Statistics

    Let's you have $10000, and you inverst 4 stocks. ['SPY', 'IBM', 'XOM', 'GOOG']. The allocation is [0 ...

  4. java匿名内部类的使用注意事项

    1.首先匿名内部类要继承自抽象基类或者实现基类接口 like this abstract class Seed{ int cnt; public Seed(int x){ cnt=x; } abstr ...

  5. zzulioj--1807--小明在努力(递归)

    1807: 小明在努力 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 95  Solved: 35 SubmitStatusWeb Board Des ...

  6. SQL Server单表已700w+将普通表转换成分区表

    最近项目中,某个表数据量爆发时增长,单表已700w+,读写性能急剧下降,所以考虑加入分区表以解燃眉之急,后续还是要分表分库,当然这是后话.下面简要说一下将普通表转为分区表的步骤.   一.创建文件组 ...

  7. HBase框架基础(三)

    * HBase框架基础(三) 本节我们继续讨论HBase的一些开发常识,以及HBase与其他框架协调使用的方式.在开始之前,为了框架之间更好的适配,以及复习之前HBase的配置操作,请使用cdh版本的 ...

  8. 001.TypeScript简介.md

    TypeScript是一门开源的,由微软开发维护的,发布于2012年10月的静态类型的语言: 他是ECMAScript的超集,支持JavaScript的所有语法和语义,并且在此基础之上提供了更多额外的 ...

  9. theano import error (win10 python2.7)

    因为项目需要,在win10-64位电脑上配置theano.但是一直有 import error的错误,找不到解决方法.作为一个python新手,实在搞不定,请大家不吝赐教!小女子不胜感激! 按照网上的 ...

  10. Linux-TCP/IP, IPv4地址类别摘要

    TCP/IP分层:                 application layer                 transport layer                 internet ...