hdu 5349 MZL's simple problem
题目连接
http://acm.hdu.edu.cn/showproblem.php?pid=5349
MZL's simple problem
Description
A simple problem
Problem Description
You have a multiple set,and now there are three kinds of operations:
1 x : add number x to set
2 : delete the minimum number (if the set is empty now,then ignore it)
3 : query the maximum number (if the set is empty now,the answer is 0)
Input
The first line contains a number $N\ (N\leq 10^6)$,representing the number of operations.
Next $N$ line ,each line contains one or two numbers,describe one operation.
The number in this set is not greater than $10^9$.
Output
For each operation 3,output a line representing the answer.
Sample Input
8
1 2
1 3
1 4
2
2
3
2
3
Sample Output
4
0
直接模拟即可,我用的平衡树。。
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<vector>
#include<map>
using std::map;
using std::min;
using std::find;
using std::pair;
using std::vector;
using std::multimap;
#define all(c) (c).begin(), (c).end()
#define iter(c) decltype((c).begin())
#define cpresent(c, e) (find(all(c), (e)) != (c).end())
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define tr(c, i) for (iter(c) i = (c).begin(); i != (c).end(); ++i)
#define pb(e) push_back(e)
#define mp(a, b) make_pair(a, b)
const int N = 1 << 20;
const int INF = 0x3f3f3f3f;
inline int read() {
char c; int r;
while (((c = getchar()) < '0' || c > '9') && c ^ '-');
bool f = c == '-'; if (f) r = 0; else r = c - '0';
while ((c = getchar()) >= '0' && c <= '9') (r *= 10) += c - '0';
if (f) return -r; else return r;
}
struct Node {
int v, s, c;
Node *ch[2];
inline void set(int _v, int _s, Node *p) {
v = _v, s = c = _s;
ch[0] = ch[1] = p;
}
inline void push_up() {
s = ch[0]->s + ch[1]->s + c;
}
inline int cmp(int x) const {
return x == v ? -1 : x > v;
}
};
struct SizeBalanceTree {
int top;
Node *null, *root, *tail;
Node stack[N], *pool[N >> 1];
inline void init() {
top = 0;
tail = &stack[0];
null = tail++;
null->set(0, 0, NULL);
root = null;
}
inline Node *newNode(int v) {
Node *x = !top ? tail++ : pool[--top];
x->set(v, 1, null);
return x;
}
inline void rotate(Node *&x, int d) {
Node *k = x->ch[!d]; x->ch[!d] = k->ch[d], k->ch[d] = x;
k->s = x->s; x->push_up(); x = k;
}
inline void Maintain(Node *&x, int d) {
if (!x->s) return;
if (x->ch[d]->ch[d]->s > x->ch[!d]->s) rotate(x, !d);
else if (x->ch[d]->ch[!d]->s > x->ch[!d]->s) rotate(x->ch[d], d), rotate(x, !d);
else return;
Maintain(x, 0), Maintain(x, 1);
}
inline void insert(Node *&x, int v) {
if (!x->s) { x = newNode(v); return; }
x->s++;
int d = x->cmp(v);
if (-1 == d) { x->c++; return; }
insert(x->ch[d], v);
x->push_up();
Maintain(x, d);
}
inline void erase(Node *&x, int p) {
if (!x->s) return;
x->s--;
int d = x->cmp(p);
if (-1 == d) {
if (x->c > 1) { x->c--; return; }
else if (!x->ch[0]->s || !x->ch[1]->s) {
pool[top++] = x;
x = x->ch[0]->s ? x->ch[0] : x->ch[1];
} else {
Node *ret = x->ch[1];
for (; ret->ch[0]->s; ret = ret->ch[0]);
erase(x->ch[1], x->v = ret->v);
}
} else {
erase(x->ch[d], p);
}
if(x->s) x->push_up();
}
inline void insert(int v) {
insert(root, v);
}
inline void erase() {
erase(root, kth(1));
}
inline int kth(int k) {
Node *x = root;
for (int t = 0; x->s; ) {
t = x->ch[0]->s;
if (k <= t) x = x->ch[0];
else if (t + 1 <= k && k <= t + x->c) break;
else k -= t + x->c, x = x->ch[1];
}
return x->v;
}
inline void query() {
if(!root->s) { puts("0"); return; }
printf("%d\n", kth(root->s));
}
}sbt;
int main(){
#ifdef LOCAL
freopen("in.txt", "r", stdin);
freopen("out.txt", "w+", stdout);
#endif
sbt.init();
int n, v, op;
while(~scanf("%d", &n)) {
sbt.init();
rep(i, n) {
op = read();
if(1 == op) v = read(), sbt.insert(v);
if(2 == op) sbt.erase();
if(3 == op) sbt.query();
}
}
return 0;
}
hdu 5349 MZL's simple problem的更多相关文章
- 2015 Multi-University Training Contest 5 hdu 5349 MZL's simple problem
MZL's simple problem Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Oth ...
- mutiset HDOJ 5349 MZL's simple problem
题目传送门 /* 这题可以用stl的mutiset容器方便求解,我对这东西不熟悉,TLE了几次,最后用读入外挂水过. 题解有O(n)的做法,还以为我是侥幸过的,后来才知道iterator it写在循环 ...
- hdoj 5349 MZL's simple problem
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5349 #include<stdio.h> int main(){ int cnt; int ...
- HDU 4267 A Simple Problem with Integers 多个树状数组
A Simple Problem with Integers Time Limit: 5000/1500 MS (Java/Others) Memory Limit: 32768/32768 K ...
- HDU 3468:A Simple Problem with Integers(线段树+延迟标记)
A Simple Problem with Integers Case Time Limit: 2000MS Description You have N integers, A1, A2, ... ...
- hdu 3483 A Very Simple Problem
两种构造的方式都是正确的: 1. #include<cstdio> #include<cstring> #include<algorithm> #define ma ...
- A simple problem 分类: 哈希 HDU 2015-08-06 08:06 1人阅读 评论(0) 收藏
A simple problem Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) To ...
- 【HDU 3483】 A Very Simple Problem (二项式展开+矩阵加速)
A Very Simple Problem Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Ot ...
- A Simple Problem with Integers 多树状数组分割,区间修改,单点求职。 hdu 4267
A Simple Problem with Integers Time Limit: 5000/1500 MS (Java/Others) Memory Limit: 32768/32768 K ...
随机推荐
- 【练习】ORACLE统计信息--直方图
①创建表tSQL> create table t as select * from dba_objects; Table created. --收集直方图 SQL> exec dbms_s ...
- 使用ngin的静态文件下载
1,主配置文件nginx.xml #user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error. ...
- java中sesion
Session *Cookie基于客户端,不安全,并且大小和个数的限制. *Session域对象,范围一次会话范围,存个人相关的数据. *setAttribute(String ...
- PL/SQL中查询某的时间段内所有执行的sql
清空缓存,重新开始统计执行的SQL alter system flush shared_pool; 查询执行过的SQL select * from v$sql where parsing_schema ...
- ssh注解basedao简单的实现
@Repository public class BaseDao extends HibernateDaoSupport{ protected Class objectClass; protected ...
- extern “C”调用测试与验证-2016.01.06
1 调用情形说明 在上一篇关于extern “c”原理以及用法中,详细的说明了为什么需要extern “c”以及如何使用它解决c与c++混合编程时遇到的问题.接下来,使用示例验证方式验证c与c++函数 ...
- 问 如何使用css将select的边框以及右边的小三角形去掉?
最好css2,css3都给出解决方案,效果如下: CSS2 只能使用div和ul进行模拟了,结构很简单,具体可参考Alice的 button-dropdownCSS3 可以使用CSS3的属性appea ...
- 做权限树时 使用EasyUI中Tree
符合EasyUI中Tree的Json格式,我们先看一下,格式是如何的 [{ "id":1, "text":"My Documents", & ...
- 使用Git上传本地项目代码到github
前提:(1)ssh密钥(让本地与git链接) & (2)装好gitbash 1.git中创建好库 2.文件夹中输入:git init (出现隐藏的.git文件) 3.git remote a ...
- .NET环境配置(二)
打开IIS服务器 首先在设置程序池 应用程序池 设置 ASP.NET v4.0 ASP.NET v4.0 Classic CLassic.NET AppPool DefaultA ...