可并堆水题

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

#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. html 浮动元素

    在CSS布局中分为内联元素(display:inline)和块状元素(display:block),块状元素默认会占据一行,可设置高度宽度以及边距,而内联元素不会也不能设置.常见的内联元素有:a.sp ...

  2. 一次搞懂 Assets Pipeline 转载自http://gogojimmy.net/2012/07/03/understand-assets-pipline/

    Assets Pipeline 是 Rails 3.1 一個重要的功能,一直並沒有很去了解其特性,但因為最近都在寫前端的東西在 assets pipeline 的東西上跌跌撞撞了不少次(尤其在 dep ...

  3. [转]android Handler使用

    转 http://blog.csdn.net/new_abc/article/details/8184634 不过这个我看不懂 不知道为什么i的值可以接着增长... package com.examp ...

  4. mybatis+postgresql平台

    mybatis+postgresql平台        最近有个项目的数据库使用postgresql,使用原生态的mybatis操作数据,原生态的没什么不好,只不过国内有个tk.mybatis的工具帮 ...

  5. Protel99 SE快捷键大全

    为了方便观看我们的protel99 se视频教程的朋友,我们在这里发布了protel99 se的所有的键盘的快捷分健大全,希望大家在学习我们的视频教程的时候,可以熟悉以下这些快捷键,因为平时我们用pr ...

  6. Java中String、StringBuilder以及StringBuffer

    原文出处: 海子 相信String这个类是Java中使用得最频繁的类之一,并且又是各大公司面试喜欢问到的地方,今天就来和大家一起学习一下String.StringBuilder和StringBuffe ...

  7. Score(规律)

    Score Time Limit : 5000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Submiss ...

  8. C语言数据结构----双向链表

    概括:主要说明双向链表的基本概念和具体操作以及源代码. 一.基本概念 1.有了单链表以后我们可以把内存中小块的空间联系在一起,并且把每一个小块都存储上我们想要存储的数值.但是单链表只有一个next,我 ...

  9. js调用.net后台

    <head runat=server> <script type="text/javascript"> $(function () { var js_tim ...

  10. Java创建线程的细节分析

    转载:http://shmilyaw-hotmail-com.iteye.com/blog/1880902 前言 关于线程创建的问题,可以说是老生常谈了.在刚开始学习Thread的时候基本上都会接触到 ...