ZOJ2334

用左偏树实现优先队列最大的好处就是两个队列合并可以在Logn时间内完成 用来维护优先队列森林非常好用。

左偏树代码的核心也是两棵树的合并!

代码有些细节需要注意。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<vector>
#include<algorithm>
#include<queue>
using namespace std;
const int maxn=200000;
struct monkey{
int num;int group;int strong;int ls; int rs;int dist;
};
int n,m,tot;
monkey mon[maxn];
int find(int x)
{
if(mon[x].group==x||mon[x].group==0)return x;
else return mon[x].group=find(mon[x].group);
} int Top(int x)
{
return find(x);
} int Merge(int x,int y)
{
if(x==y)return x;
if(!x)return mon[y].group=y;
if(!y)return mon[x].group=x;
if(mon[x].strong<mon[y].strong)swap(x,y); mon[x].rs=Merge(mon[x].rs,y);
mon[mon[x].rs].group=x;
if(mon[mon[x].ls].dist<mon[mon[x].rs].dist)swap(mon[x].ls,mon[x].rs);
mon[x].dist=mon[mon[x].rs].dist+1;
return mon[x].group=x;
}
int Pop(int x)
{ mon[x].group=Merge(mon[x].ls,mon[x].rs);
mon[x].ls=mon[x].rs=mon[x].dist=0;
} void Insert(int x,int y)
{
Merge(find(x),y);
}
int main()
{freopen("t.txt","r",stdin);
//freopen("1.txt","w",stdout);
tot=0;
while(scanf("%d",&n)!=EOF)
{
tot++;
memset(mon,0,sizeof(mon));
for(int i=1;i<=n;i++)
{ mon[i].num=mon[i].group=i;mon[i].ls=mon[i].rs=mon[i].dist=0;
scanf("%d",&mon[i].strong);
}
scanf("%d",&m);
int a,b;
for(int i=1;i<=m;i++)
{
scanf("%d%d",&a,&b);
a=find(a);b=find(b);
if(a==b){printf("-1\n");continue;}
mon[a].strong/=2;mon[b].strong/=2;
Pop(a);
Pop(b);
Insert(find(a),a);
Insert(find(b),b); printf("%d\n",max(mon[find(a)].strong,mon[find(b)].strong));
Merge(find(a),find(b));
}
}
return 0;
}

  

ZOJ2334 Monkey King 左偏树的更多相关文章

  1. HDU1512 ZOJ2334 Monkey King 左偏树

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

  2. hdu 1512 Monkey King 左偏树

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

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

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

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

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

  5. hdu 1512 Monkey King —— 左偏树

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1512 很简单的左偏树: 但突然对 rt 的关系感到混乱,改了半天才弄对: 注意是多组数据! #includ ...

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

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

  7. 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 : ...

  8. HDU 1512 Monkey King ——左偏树

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

  9. HDU 1512 Monkey King(左偏堆)

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

随机推荐

  1. linux-vmstat-显示虚拟内存状态

    推荐:更多linux 性能监测与优化 关注:linux命令大全 vmstat命令的含义为显示虚拟内存状态(“Viryual Memor Statics”),但是它可以报告关于进程.内存.I/O等系统整 ...

  2. python3 时间模块 random模块之两个小练习

    话不多说,一个是算时间的,还有一个是生成验证码的 #!usr/bin/env/ python # -*- coding:utf-8 -*- # Author: XiaoFeng import time ...

  3. 匹配 C 语言样式字符串

    #include <stdio.h> char haha[] = "nihaoma" "niubi" "\"hello worl ...

  4. ubuntu_linux自动补全出现问题

    问题:输入: cd p,使用Tab补全,期望进入pub_work目录,虽然自动补全,成功进入目录:却给我打印一连串的字符,纠结: fly@Flyme:~$ cd p+ local cur prev w ...

  5. [fw]Best Practices for Exception Handling

    http://www.onjava.com/pub/a/onjava/2003/11/19/exceptions.html http://www.onjava.com/pub/a/onjava/200 ...

  6. 网线切割&切绳子

    题目描述 Wonderland居民决定举行一届地区性程序设计大赛.仲裁委员会志愿负责这次赛事并且保证会组织一次有史以来最公正的比赛.为此,所有参赛者的电脑和网络中心会以星状网络连接,也就是说,对每个参 ...

  7. 强连通图 HDU - 1269

    为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单向的,就是说若称某通道连通了A房间和B房间,只说明可以 ...

  8. springmvc 日期转换器

    package com.xxx.common.controller.converter; import org.joda.time.DateTime; import org.joda.time.for ...

  9. 网上的仿QQ验证码,详细使用方法

    struts2的配置 和代码 1.生成图片流 类名:VerifyCodeUtils /** * 生成图片流 * @author Administrator * */ import java.awt.C ...

  10. 用Docker创建Nexus

    步骤如下: 1. 创建持久化目录 $ mkdir /some/dir/nexus-data && chown -R 200 /some/dir/nexus-data 2. 创建镜像并运 ...