nkoj P3138 罗马游戏

问题描述

罗马皇帝很喜欢玩杀人游戏。
他的军队里面有n个人,每个人都是一个独立的团。
最近举行了一次比武测试,每个人都得到了一个分数。 皇帝对那些得分很低的人嗤之以鼻。他决定玩这样一个游戏。 它可以发两种命令:

  1. Merger(i, j)。把i所在的团和j所在的团合并成一个团。如果i, j有一个人是死人,那么就忽略该命令。
  2. Kill(i)。把i所在的团里面得分最低的人杀死。如果i这个人已经死了,这条命令就忽略。
    皇帝希望他每发布一条kill命令,下面的将军就把被杀的人的分数报上来。(如果这条命令被忽略,那么就报0分)

输入格式

第一行一个整数n(1<=n<=300000)。n表示士兵数
第二行n个整数,其中第i个数表示编号为i的士兵的分数。(分数都是[0…10000]之间的整数)
第三行一个整数m(1<=m<=100000),表示总共有m条命令
第3+i行描述第i条命令。命令为如下两种形式:
1号命令:M i j
2号命令:K i

输出格式

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

样例输入

5
100 90 66 99 10
7
M 1 5
K 1
K 1
M 2 3
M 3 4
K 5
K 4

样例输出

10
100
0
66

一点小想法

这是一道左偏树的模板题。

题目中的 M 操作就是左偏树中的合并两个。而 K 操作就是弹出堆顶的元素。

需要注意的是:在合并堆和删除堆顶元素的过程中,不仅要维护左偏树,还要注意维护并查集。尤其是在删除堆顶元素时,我们不仅要更新被弹出元素节点的父亲,还要更新新堆顶元素节点的父亲,让新堆顶元素满足堆顶元素的父亲就是堆顶元素本身的并查集性质,方便以后继续用并查集查询。 这是我的博客,有兴趣的朋友可以进来参观。

代码

#include <cstdio>
#include <algorithm>
#include <queue>
#include <cstdlib>
#include <string>
#include <cstring>
#include <iostream>
using namespace std;
const int Max = 300000 + 5;
struct node {int val, Lc, Rc, Dis;
} tree[Max];
int father[Max];
int getfather(int x) {if(x == father[x]) return x;return father[x] = getfather(father[x]);
}
int merge(int x, int y) { //合并堆if(!x || !y) {return x + y;}if(tree[x].val > tree[y].val)swap(x, y);tree[x].Rc = merge(tree[x].Rc, y);if(tree[tree[x].Rc].Dis > tree[tree[x].Lc].Dis)swap(tree[x].Rc, tree[x].Lc);tree[x].Dis = tree[tree[x].Rc].Dis + 1;return x;
}
int del(int x) { //删除堆顶元素int fx = getfather(x);int xx = merge(tree[fx].Lc, tree[fx].Rc);tree[fx].val = -1;tree[fx].Dis = 1;tree[fx].Lc = tree[x].Rc = 0;return xx;
}
int n, m;
bool die[Max];int main() {scanf("%d", &n);for(int i = 1; i <= n; i++) {scanf("%d", &tree[i].val);tree[i].Dis = 1;father[i] = i;}scanf("%d", &m);while(m--) {char opt;cin >> opt;if(opt == 'M') {int a, b;scanf("%d %d", &a, &b);if(die[a] || die[b]) continue;a = getfather(a); b = getfather(b);if(a == b) continue;int p = merge(a, b);father[a] = father[b] = p;//更新并查集}else {int a;scanf("%d", &a);if(die[a]) {puts("0");continue;}a = getfather(a);     printf("%d\n", tree[a].val);father[a] = del(a);//更新被弹出节点的父亲die[a] = true;father[father[a]] = father[a]; //更新新堆顶元素的父亲}}return 0;
}

nkoj P3138 罗马游戏相关推荐

  1. BZOJ 1455: 罗马游戏( 配对堆 + 并查集 )

    可并堆水题 --------------------------------------------------------- #include<bits/stdc++.h> using ...

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

    [bzoj1455]罗马游戏 可并堆 2016-05-31  10:04:41 可并堆的裸题. 左偏树(小根堆为例 性质 1.满足堆的性质,每个节点权值小于左右儿子权值 2.每个节点有dis值,表示子 ...

  3. BZOJ1455罗马游戏

    左偏树裸题 (搞板子搞到绝望x //罗马游戏 #include <bits/stdc++.h> using namespace std; const int N = 1000050; in ...

  4. bzoj1455罗马游戏*

    bzoj1455罗马游戏 题意: 维护数据结构支持合并和弹出最小值.n≤1000000,m≤100000 题解: 可并堆,注意本题合并时要判断两个节点是否在同一个堆中.本弱写了左偏树和斜堆,发现斜堆比 ...

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

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

  6. 【洛谷】P2713 罗马游戏

    题目地址: https://www.luogu.com.cn/problem/P2713 题目描述: 罗马皇帝很喜欢玩杀人游戏.他的军队里面有nnn个士兵,每个士兵都是一个独立的团.最近举行了一次平面 ...

  7. BZOJ 1455 罗马游戏

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

  8. 【BZOJ 1455】罗马游戏

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

  9. bzoj1455 罗马游戏

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

最新文章

  1. 2019元月新SAP项目落地记
  2. console 非常实用的方法
  3. cuda-convnet2编译
  4. 逆向工程核心原理学习笔记(二):字符串检索法查找main函数
  5. 那时我大约5岁的飞鸽传书
  6. 编译并使用boost库(win7+boost1.60+vs2013)
  7. python json转dict(dict转json)
  8. OpenCV-获取图像中圆线上的数据
  9. 【IDEA】关于 IDEA 中新建 web 项目的 webapp 文件夹没有小蓝点 ,启动服务,访问不到解决方案
  10. 读取进程access_IOT指南之嵌入式软件篇gt;5.Linux c编程之进程间通信(管道)
  11. 人生的一切问题,归根结底就是这三点:无知!恐惧!延迟!
  12. JVM内存:年轻代,老年代,永久代
  13. MTK 6735/6739/6755/6763 android8.1 user版本打开root权限(adb root权限和 apk root权限)
  14. js获取ip地址、浏览器信息
  15. 使用NE555实现的延时开关电路
  16. python有哪两种表现形式小练笔_写一篇不一样的爱400字:爱有两种表现形式小练笔400字...
  17. 计算机图像处理之形状变换
  18. 小程序 订阅消息 原来就是如此
  19. 深圳入职两周的感想——防止入坑
  20. K近邻的MATLAB实现

热门文章

  1. Java -mail 退信代码说明
  2. 在德国如何优雅地和同事说再见
  3. O2O电商平台如何发展?
  4. shell------免交互
  5. ubuntu16.04 titan rtx 24g +显卡驱动+cuda10.1+cudnn环境配置
  6. 【mfxp】关于播放器插件损坏的解决方案
  7. EMC VNX证书过期解决方案
  8. 大逃杀最多100人服务器,绝地求生大逃杀服务器怎么回事 玩家太多服务器承受不了...
  9. 7个管理学常用工具:SWOT、PDCA、6W2H、SMART、WBS、二八原则
  10. mysql 谓语提前_表语 谓语 提前 是什么倒装