【HDOJ】【1512】Monkey King
数据结构/可并堆
啊……换换脑子就看了看数据结构……看了一下左偏树和斜堆,鉴于左偏树不像斜堆可能退化就写了个左偏树。
左偏树介绍:http://www.cnblogs.com/crazyac/articles/1970176.html
体会:合并操作是可并堆的核心操作(就像LCT里的access),进堆和弹堆顶都是直接调用合并操作实现的。
而合并的实现是一个递归的过程:将小堆与大堆的右儿子合并(这里的大小指的是堆顶元素的大小),直到某个为0。(是不是有点启发式合并的感觉……)
在合并的过程中要维护堆的形态:如果右儿子长度(或者叫深度?)大于左儿子,那就交换左右儿子。也就是说:每次要生长的时候,总是让短的一侧先生长,那么这个堆,最后就能够比较对称。
//HDOJ 1512
#include<vector>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define rep(i,n) for(int i=0;i<n;++i)
#define F(i,j,n) for(int i=j;i<=n;++i)
#define D(i,j,n) for(int i=j;i>=n;--i)
#define pb push_back
using namespace std;
inline int getint(){
int v=,sign=; char ch=getchar();
while(ch<''||ch>''){ if (ch=='-') sign=-; ch=getchar();}
while(ch>=''&&ch<=''){ v=v*+ch-''; ch=getchar();}
return v*sign;
}
const int N=1e6+,INF=~0u>>;
typedef long long LL;
/******************tamplate*********************/
int n,m;
struct node{
int v,l,r,dis,f;
node(int v=,int l=,int r=,int dis=,int f=):
v(v),l(l),r(r),dis(dis),f(f){}
void out(){
printf("%d %d %d %d %d\n",v,l,r,dis,f);
}
};
struct Left_tree{
node t[N];
int merge(int x,int y){
if (x==) return y;
if (y==) return x;
if (t[x].v<t[y].v) swap(x,y);
t[x].r=merge(t[x].r,y);
t[t[x].r].f=x;
if (t[t[x].l].dis<t[t[x].r].dis) swap(t[x].l,t[x].r);
if (t[x].r==) t[x].dis=;
else t[x].dis=t[t[x].r].dis+;
return x;
}
int pop(int x){
int l=t[x].l,r=t[x].r;
t[l].f=l; t[r].f=r;
t[x].l=t[x].r=t[x].dis=;
return merge(l,r);
}
int find(int x){return t[x].f==x ? x : find(t[x].f);}
void init(){
int x=;
F(i,,n){
x=getint();
t[i]=node(x);
t[i].f=i;
}
}
void solve(){
m=getint();
int x,y;
F(i,,m){
x=getint(); y=getint();
int f1=find(x),f2=find(y);
if (f1==f2){puts("-1");continue;}
int t1=pop(f1),t2=pop(f2);
t[f1].v/=; t1=merge(t1,f1);
t[f2].v/=; t2=merge(t2,f2);
t1=merge(t1,t2);
printf("%d\n",t[t1].v);
}
}
}heap;
int main(){
#ifndef ONLINE_JUDGE
freopen("1512.in","r",stdin);
freopen("1512.out","w",stdout);
#endif
while(scanf("%d",&n)!=EOF){
heap.init(); heap.solve();
}
return ;
}
【HDOJ】【1512】Monkey King的更多相关文章
- 【HDOJ图论题集】【转】
=============================以下是最小生成树+并查集====================================== [HDU] How Many Table ...
- 【集训笔记】博弈论相关知识【HDOJ 1850【HDOJ2147
以下资料来自:http://blog.csdn.net/Dinosoft/article/details/6795700 http://qianmacao.blog.163.com/blog/stat ...
- HDU - 1512 Monkey King
Problem Description Once in a forest, there lived N aggressive monkeys. At the beginning, they each ...
- 【HDOJ 5379】 Mahjong tree
[HDOJ 5379] Mahjong tree 往一颗树上标号 要求同一父亲节点的节点们标号连续 同一子树的节点们标号连续 问一共同拥有几种标法 画了一画 发现标号有二叉树的感觉 初始标号1~n 根 ...
- HDOJ 1238 Substrings 【最长公共子串】
HDOJ 1238 Substrings [最长公共子串] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Ja ...
- HDOJ 1423 Greatest Common Increasing Subsequence 【DP】【最长公共上升子序列】
HDOJ 1423 Greatest Common Increasing Subsequence [DP][最长公共上升子序列] Time Limit: 2000/1000 MS (Java/Othe ...
- HDOJ 1501 Zipper 【DP】【DFS+剪枝】
HDOJ 1501 Zipper [DP][DFS+剪枝] Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Ja ...
- 【HDOJ 2089】不要62
[HDOJ 2089]不要62 第一个数位dp的题 做的老困难了...只是好歹是做出来了 迈出了第一步.. 对大牛来说这样的题都是小case ps:新上一个记忆化方法 一些绕弯的题里用dfs好想些 代 ...
- 【HDOJ 5371】 Hotaru's problem
[HDOJ 5371] Hotaru's problem Manacher算法+穷举/set Manacher算法一好文:http://blog.csdn.net/yzl_rex/article/de ...
- 【HDOJ 5654】 xiaoxin and his watermelon candy(离线+树状数组)
pid=5654">[HDOJ 5654] xiaoxin and his watermelon candy(离线+树状数组) xiaoxin and his watermelon c ...
随机推荐
- php数据过滤函数与方法示例【转载】
1.php提交数据过滤的基本原则 1)提交变量进数据库时,我们必须使用addslashes()进行过滤,像我们的注入问题,一个addslashes()也就搞定了.其实在涉及到变量取值时,intval( ...
- CCNA长语
思科认证网络支持工程师(Cisco Certified Network Associate_CCNA) 专业英文词汇大全 10BaseT-----原始IEEE802.3标准的一部分,1OBaseT是1 ...
- Ajax_2
<script> var xmlHttp;//创建一个对象 function queryDetail(id){ if(window.ActiveXObject){ xmlHttp = ne ...
- spring3中新增的@value注解
在spring 3.0中,可以通过使用@value,对一些如xxx.properties文件 中的文件,进行键值对的注入,例子如下: 1 首先在applicationContext.xml中加入: ...
- TreeView控件的CheckBox级联选中或取消
背景: 在一个项目开发中遇到这样的要求:当选中树中一个节点时,需要同时选中其父节点,直至根节点.在取消一个节点的选中时,需要将其所有子节点取消选中,直至叶子节点.由于项目用户体验暂时可以不用考虑,直接 ...
- 南阳理工ACM1076--方案数量
题目地址:http://acm.nyist.net/JudgeOnline/problem.php?pid=1076 分析: <span style="font-size:18px;& ...
- photoshop如何把阴影分离开(让阴影单独成为一个图层)
作图的时候经常会用到,给图片加个投影,但有时还满足不了自己的需要,于是可以把投影分离开来单独操作投影. 图层->图层样式->创建图层 有时还需要滤镜->模糊 一下 哈哈,下次忘了来翻 ...
- 使用原生Sql查询实现按分类推送最新文章到首页
一般在网站的首页都会有网站最新文章的推送,而这些文章又属于不同的分类.如果某个分类的文章突然集中在一个时间段发布,那么就会造成首页上所有文章都是该分类的文章,其他的文章分类就变成不可见的了.所以,我希 ...
- PHP运行方式对比
文章内容来自以下站点http://www.cnblogs.com/xia520pi/p/3914964.html 关于PHP目前比较常见的五大运行模式: 1.CGI(通用网关接口 / Common G ...
- jQuery基础选择器
attr()方法的功能是设置或获取元素的某项属性值. attr("disabled", "true”)表示使该功能不可用. #id 选择器 $("#my_id& ...