罗马游戏

题目描述

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

  他决定玩这样一个游戏。 它可以发两种命令:

  1. Merger(i, j)。把i所在的团和j所在的团合并成一个团。如果i, j有一个人是死人,那么就忽略该命令。
  2. Kill(i)。把i所在的团里面得分最低的人杀死。如果i这个人已经死了,这条命令就忽略。

    皇帝希望他每发布一条kill命令,下面的将军就把被杀的人的分数报上来。(如果这条命令被忽略,那么就报0分)

输入输出格式

输入格式:

  第一行一个整数n(1<=n<=1000000)。n表示士兵数,m表示总命令数。

  第二行n个整数,其中第i个数表示编号为i的士兵的分数。(分数都是[0..10000]之间的整数)

  第三行一个整数m(1<=m<=100000) 第3+i行描述第i条命令。命令为如下两种形式: 1. M i j 2. K i

输出格式:

  如果命令是Kill,对应的请输出被杀人的分数。(如果这个人不存在,就输出0)

输入输出样例

  1. 输入样例:
  2. 5
  3. 100 90 66 99 10
  4. 7
  5. M 1 5
  6. K 1
  7. K 1
  8. M 2 3
  9. M 3 4
  10. K 5
  11. K 4

  

  1. 输出样例:
  2. 10
  3. 100
  4. 0
  5. 66

  分析:很明显这是一道可并堆的经典题目,题目字面翻译过来就是合并小根堆,并且查询最小值后删除最小值,比较简单,类似于板子题。

  1. #include <stdio.h>
  2. #include <algorithm>
  3. using namespace std;
  4. int dis[1000001];
  5. int num[1000001];
  6. int son[1000001][2];
  7. int fa[1000001];
  8. bool kill[1000001];
  9. int n,m;
  10. int find(int p)
  11. {
  12. if(fa[p]==0) return 0;
  13. return (fa[p]==p)?p:fa[p]=find(fa[p]);
  14. }
  15. int merge(int x,int y)
  16. {
  17. if(!x) return y;
  18. if(!y) return x;
  19. if(num[x]>num[y]) swap(x,y);
  20. son[x][1]=merge(son[x][1],y);
  21. if(dis[son[x][1]]>dis[son[x][0]])
  22. swap(son[x][1],son[x][0]);
  23. dis[x]=dis[son[x][1]]+1;
  24. return x;
  25. }
  26. int main()
  27. {
  28. dis[0]=-1;
  29. scanf("%d",&n);
  30. for(int i=1;i<=n;i++)
  31. scanf("%d",&num[i]),fa[i]=i;
  32. scanf("%d",&m);
  33. for(int i=1;i<=m;i++)
  34. {
  35. int a,b;
  36. char kind[2];
  37. scanf("%s",kind);
  38. if(kind[0]=='M')
  39. {
  40. scanf("%d%d",&a,&b);
  41. if(kill[a]||kill[b]) continue;
  42. a=find(a),b=find(b);
  43. if(a!=b) fa[a]=fa[b]=merge(a,b);
  44. }
  45. else
  46. {
  47. scanf("%d",&a);
  48. if(kill[a])
  49. {
  50. printf("0\n");
  51. continue;
  52. }
  53. int rt;
  54. printf("%d\n",num[rt=find(a)]);
  55. kill[rt]=true;
  56. b=son[rt][0],a=son[rt][1];
  57. fa[rt]=fa[a]=fa[b]=merge(a,b);
  58. }
  59. }
  60. }

  

bzoj1455&&luogu2713罗马游戏的更多相关文章

  1. 【BZOJ1455】罗马游戏(左偏树)

    [BZOJ1455]罗马游戏(左偏树) 题面 BZOJ 然而权限题. 题解 左偏树模板题. #include<iostream> #include<cstdio> #inclu ...

  2. 【BZOJ-1455】罗马游戏 可并堆 (左偏树)

    1455: 罗马游戏 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1355  Solved: 561[Submit][Status][Discuss] ...

  3. 【bzoj1455】罗马游戏 可并堆

    2016-05-31  10:04:41 可并堆的裸题. 左偏树(小根堆为例 性质 1.满足堆的性质,每个节点权值小于左右儿子权值 2.每个节点有dis值,表示子树最浅的叶子深度加1 3.左子树dis ...

  4. C++之路进阶——bzoj1455(罗马游戏)

    F.A.Qs Home Discuss ProblemSet Status Ranklist Contest ModifyUser  gryz2016 Logout 捐赠本站 Notice:由于本OJ ...

  5. 【bzoj1455】罗马游戏

    1455: 罗马游戏 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1061  Solved: 439[Submit][Status][Discuss] ...

  6. 【bzoj1455】罗马游戏 可并堆+并查集

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

  7. BZOJ1455:罗马游戏

    题目传送门:https://lydsy.com/JudgeOnline/problem.php?id=1455 浅谈左偏树:https://www.cnblogs.com/AKMer/p/102466 ...

  8. 【XSY1986】【BZOJ1455】罗马游戏

    就是一模板题. 合并就直接merge. pop就是将自己的值设为一,再将自己的左右儿子合并即可. 查询直接找到堆顶,输出. 模板左偏树 代码: #include<bits/stdc++.h> ...

  9. [bzoj1455]罗马游戏_左偏树_并查集

    罗马游戏 bzoj-1455 题目大意:给你n个人,2种操作,m次操作:1.将i号士兵所在的集合的最小值删除 2.合并i和j两个士兵所在的团体 注释:$1\le n\le 10^6$,$1\le m ...

随机推荐

  1. mac terminal基本命令

    文件目录 首先要清楚几个文件目录: " / "  :根目录 " ~ " :用户主目录的缩写.例如当前用户为esther,那么" ~ "展开来 ...

  2. 图学java基础篇之并发

    概述 并发处理本身就是编程开发重点之一,同时内容也很繁杂,从底层指令处理到上层应用开发都要涉及,也是最容易出问题的地方.这块知识也是评价一个开发人员水平的重要指标,本人自认为现在也只是学其皮毛,因此本 ...

  3. Go语言之反射(三)

    结构体转JSON JSON格式是一种用途广泛的对象文本格式.在Go语言中,结构体可以通过系统提供的json.Marshal()函数进行序列化.为了演示怎么样通过反射获取结构体成员以及各种值的过程,下面 ...

  4. vrpie在Visio Studio 中无法调试的问题

    最近这这几天一直在研究vrpie,之前不能调试,一调试就出问题,打开那个生成的htm文件是没问题的,最初的解决方法是不通过调试来打可那个htm页面,但是这样比较麻烦,因为经常需要和服务器交互,就只能用 ...

  5. 我对于js注入的理解

    资料:http://blog.csdn.net/gisredevelopment/article/details/41778671 js注入就是在前端利用使用js的地方 在这其中注入你写的js代码 使 ...

  6. 虚拟机VMware安Mac OS时没有Apple mac选项

    相信大家很多人在虚拟机安装mac os时候发现在选择客户机操作系统时候,没有Apple mac os选项,这样就会导致无法进行下一步,下面我来给大家详细介绍怎么添加这一项. 1.首先安装unlocke ...

  7. day05_08 列表讲解、切片、内置方法

      1.0 查询: a = ['wuchao','jinxing','xiaohu','sanpang','ligang'] print(a[3]) #>>>sanpang prin ...

  8. Web 安全问题 rel="noopener nofollw"

    1. noopener 如果你需要用 a 标签打开一个标签页时,你会使用 target='_blank' 这个属性,此时你需要添加 rel='noreferrer noopener' 当你使用 tar ...

  9. Composer 下载安装类库

    安装 Composer 你需要先下载 composer.phar 可执行文件. curl -sS https://getcomposer.org/installer | php composer.js ...

  10. CSU-1980 不堪重负的树

    CSU-1980 不堪重负的树 Description 小X非常喜欢树,然后他生成了一个大森林给自己玩. 玩着玩着,小X陷入了沉思. 一棵树由N个节点组成,编号为i的节点有一个价值Wi. 假设从树根出 ...