可并堆水题

---------------------------------------------------------

#include<bits/stdc++.h>
 
using namespace std;
 
const int maxn = 1000009;
 
struct Node {
Node *l, *r, *ch;
int v, id;
} pool[maxn], *null, *pt = pool, *q[maxn];
 
Node* newNode(int v, int id) {
pt->l = pt->r = pt->ch = null; pt->v = v; pt->id = id;
return pt++;
}
 
void init() {
null = pt++;
null->l = null->r = null->ch = null;
}
 
Node* join(Node* x, Node* y) {
if(x->v < y->v) swap(x, y);
x->l = y; x->r = y->ch;
y->ch->l = x; y->ch = x;
return y;
}
 
struct ph {
Node* root;
void init() {
root = null;
}
inline Node* top() {
return root;
}
inline void push(int id, int v) {
Node* t = newNode(v, id);
root = root == null ? t : join(root, t);
}
void pop() {
if(root->ch != null) {
int n = 0;
for(Node* t = root->ch; t != null; q[n++] = t, t = t->r);
int m = n >> 1;
for(int i = 0; i < m; i++) {
q[i]->l = q[i]->r = null;
q[i + m]->l = q[i + m]->r = null;
q[i] = join(q[i], q[i + m]);
}
root = q[0];
if((n & 1) && m) root = join(root, q[n - 1]);
for(int i = 1; i < m; i++)
   root = join(root, q[i]);
} else 
   root = null;
}
} S[maxn];
 
bool alive[maxn];
int fa[maxn];
 
int find(int x) {
return x == fa[x] ? x : fa[x] = find(fa[x]);
 
int main() {
init();
int N; scanf("%d", &N);
for(int i = 0; i < N; i++) {
fa[i] = i;
alive[i] = true;
int mark; scanf("%d", &mark);
S[i].init();
S[i].push(i, mark);
}
int M; scanf("%d", &M);
while(M--) {
char c; scanf(" %c", &c);
if(c == 'M') {
int u, v; scanf("%d%d", &u, &v); u--; v--;
if(!alive[u] || !alive[v]) continue;
u = find(u); v = find(v);
if(u == v) 
continue;
else 
fa[u] = v;
S[v].root = join(S[u].root, S[v].root);
} else {
int t; scanf("%d", &t); t--;
if(!alive[t]) {
puts("0");
continue;
}
t = find(t);
Node* o = S[t].top(); S[t].pop();
alive[o->id] = false;
printf("%d\n", o->v);
}
}
return 0;
}

---------------------------------------------------------

1455: 罗马游戏

Time Limit: 5 Sec  Memory Limit: 64 MB
Submit: 877  Solved: 354
[Submit][Status][Discuss]

Description

罗马皇帝很喜欢玩杀人游戏。 他的军队里面有n个人,每个人都是一个独立的团。最近举行了一次平面几何测试,每个人都得到了一个分数。 皇帝很喜欢平面几何,他对那些得分很低的人嗤之以鼻。他决定玩这样一个游戏。 它可以发两种命令: 1. Merger(i, j)。把i所在的团和j所在的团合并成一个团。如果i, j有一个人是死人,那么就忽略该命令。 2. Kill(i)。把i所在的团里面得分最低的人杀死。如果i这个人已经死了,这条命令就忽略。 皇帝希望他每发布一条kill命令,下面的将军就把被杀的人的分数报上来。(如果这条命令被忽略,那么就报0分)

Input

第一行一个整数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

Output

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

Sample Input

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

Sample Output

10
100
0
66

HINT

Source

BZOJ 1455: 罗马游戏( 配对堆 + 并查集 )的更多相关文章

  1. BZOJ 1455: 罗马游戏 [可并堆]

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

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

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

  3. bzoj 1455: 罗马游戏

    1455: 罗马游戏 Time Limit: 5 Sec  Memory Limit: 64 MB Description 罗马皇帝很喜欢玩杀人游戏. 他的军队里面有n个人,每个人都是一个独立的团.最 ...

  4. BZOJ 1455 罗马游戏 左偏树

    题目大意:给定n个点,每一个点有一个权值,提供两种操作: 1.将两个点所在集合合并 2.将一个点所在集合的最小的点删除并输出权值 非常裸的可并堆 n<=100W 启示式合并不用想了 左偏树就是快 ...

  5. BZOJ 1455 罗马游戏 ——左偏树

    [题目分析] 左偏树的模板题目,大概就是尽量维护树的深度保持平衡,以及尽可能的快速合并的一种堆. 感觉和启发式合并基本相同. 其实并没有快很多. 本人的左偏树代码自带大常数,借鉴请慎重 [代码] #i ...

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

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

  7. 1455: 罗马游戏[左偏树or可并堆]

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

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

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

  9. BZOJ 4569 [Scoi2016]萌萌哒 | ST表 并查集

    传送门 BZOJ 4569 题解 ST表和并查集是我认为最优雅(其实是最好写--)的两个数据结构. 然鹅!他俩加一起的这道题,我却--没有做出来-- 咳咳. 正解是这样的: 类似ST表有\(\log ...

随机推荐

  1. python 冒泡和快排,不多说【无聊】

    #-*-coding:utf8-*- import random a=[] b=[] def init_array(): for i in range(10000): v = random.randi ...

  2. shopnc b2b2c如何开启伪静态??

    shopnc b2b2c开启伪静态的方法 一. windows环境下 1.先下载isapi rewrite插件,安装,然后我们把根目录下面的htaccess.txt那么修改成.htaccess即可. ...

  3. 哈夫曼树(Huffman)的JS实现

    我本身并不懂哈夫曼树也不知道有什么用,GOOGLE了下,也只是一知半解,只是刚好看到有JAVA实现版,又看了下生成原理,感觉挺有意思,就写了一下 有些地方可以优化,效率不怎么样的,纯好玩,也不保证一定 ...

  4. Python的安装和详细配置(转)

    Python是一种面向对象.解释型计算机程序设计语言.被认为是比较好的胶水语言.至于其他的,你可以去百度一下.本文仅介绍python的安装和配置,供刚入门的朋友快速搭建自己的学习和开发环境.本人欢迎大 ...

  5. 再探java基础——break和continue的用法

    再探java基础——break和continue的用法 break break可用于循环和switch...case...语句中. 用于switch...case中: 执行完满足case条件的内容内后 ...

  6. HDU 2815 Mod Tree

    不会,先搁着…… http://blog.csdn.net/acm_cxlove/article/details/7832197

  7. Flex 事件机制

    使用ActionScript的单击事件示例 <?xml version="1.0" encoding="utf-8"?> <s:Applica ...

  8. 设计模式的C++实现 2.工厂模式

    工厂模式,实例化对象,用工厂方法取代new操作. 工厂模式基本与简单工厂模式差点儿相同,简单工厂中每次加入一个子类必须在工厂类中加入一个推断分支,这违背了开闭原则.而工厂模式的解决方法是将简单工厂中的 ...

  9. POJ 3228Gold Transportation(二分+最大流)

    题目地址:POJ3288 这个题跟之前的一道题混了,感觉是一样的,所以连想都没怎么想就拆点然后求最短路然后二分求最大流了.结果连例子都只是,还一直以为又是哪里手残了..结果看了看例子,手算也确实不正确 ...

  10. asp.net个人笔记

    1.进程外session一记 配置进程外session, 在webconfig中配置<sessionState timeout="60" mode="StateSe ...