洛谷 1486/BZOJ 1503 郁闷的出纳员
1503: [NOI2004]郁闷的出纳员
Time Limit: 5 Sec Memory Limit: 64 MB
Submit: 13866 Solved: 5069
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
I 60
I 70
S 50
F 2
I 30
S 15
A 5
F 1
F 2
Sample Output
20
-1
2
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cctype> inline void read(int & x)
{
int k = ; x = ;
char c = getchar();
while (!isdigit(c))
if (c == '-') k = -, c = getchar();
else c = getchar();
while (isdigit(c))
x = (x << ) + (x << ) + (c ^ ),
c = getchar();
x *= k;
} const int N = , inf = ;
const double alpha = 0.8;
int m, low, x, root, goat, tot = , Cm = , what = , len, id = ;
int siz[N], val[N], faz[N], son[N][], cur[N], vis[N]; char opt; inline int max(const int &a, const int &b)
{
return a > b ? a : b;
} inline int min(const int &a, const int &b)
{
return a > b ? b : a;
} inline int balance(int u)
{
return (double)alpha * siz[u] > (double)max(siz[son[u][]], siz[son[u][]]);
} inline int Getx(int x)
{
int u = root;
while (u)
if (val[u] == x) return u;
else if (val[u] > x) u = son[u][];
else u = son[u][];
return u;
} inline void Recycle(int u)
{
if (!u) return;
Recycle(son[u][]);
cur[++len] = u;
Recycle(son[u][]);
} inline int Build(int l, int r)
{
if (l > r) return ;
int mid = l + r >> , u = cur[mid];
faz[son[u][] = Build(l, mid - )] = u;
faz[son[u][] = Build(mid + , r)] = u;
siz[u] = siz[son[u][]] + siz[son[u][]] + (val[u] + Cm >= low);
return u;
} inline void Rebuild(int u)
{
len = ;
Recycle(u);
int y = faz[u], ch = son[y][] == u, rt = Build(, len);
faz[son[y][ch] = rt] = y;
if (root == u) root = rt;
} inline void Insert(int x)
{
if (x + Cm < low) return;
if (!root)
{
siz[root = ++tot] = ;
faz[root] = ;
val[root] = x;
return;
}
int u = root;
while (true)
{
++siz[u];
int y = u;
u = son[u][x >= val[u]];
if (!u)
{
siz[++tot] = ;
val[tot] = x;
faz[tot] = y;
son[y][x >= val[y]] = tot;
break;
}
}
goat = ;
faz[root] = ;
for (int i = tot; i; i = faz[i])
{
if (!balance(i)) goat = i;
}
if (goat) Rebuild(goat);
} inline void Getkth(int k)
{
if (k > siz[root]) { puts("-1"); return; };
int u = root;
while (u)
{
if (siz[son[u][]] + == k) break;
else if (siz[son[u][]] >= k) u = son[u][];
else k -= siz[son[u][]] + , u = son[u][];
}
if (!u || val[u] + Cm < low) puts("-1"); else printf("%d\n", val[u] + Cm);
} void DFS(int u)
{
if (!u) return;
DFS(son[u][]); DFS(son[u][]);
if (val[u] + Cm < low && !vis[u]) val[u] = -inf, ++what, vis[u] = ;
} void CNT(int u)
{
if (!u) return;
CNT(son[u][]); CNT(son[u][]);
siz[u] = siz[son[u][]] + siz[son[u][]] + (val[u] + Cm >= low);
} int main()
{
read(m), read(low);
for (int i = ; i <= m; ++i)
{
opt = getchar();
while (opt == ' ' || opt == '\n') opt = getchar();
read(x);
if (opt == 'F') Getkth(x);
if (opt == 'I') Insert(x - Cm);
if (opt == 'A') Cm += x;
if (opt == 'S') Cm -= x, DFS(root), CNT(root);
}
DFS(root);
printf("%d", what);
return ;
}
洛谷 1486/BZOJ 1503 郁闷的出纳员的更多相关文章
- 【洛谷1486】[NOI2004] 郁闷的出纳员(Splay的小运用)
点此看题面 大致题意: 你是一个公司的出纳员,现在有\(n\)个操作,操作有4种:新来一个员工.增加全体员工工资.减少全体员工工资.查询第\(k\)多的工资.若一个员工的工资在某一时刻低于合同上的工资 ...
- [BZOJ 1503]郁闷的出纳员(fhq treap)
[BZOJ 1503]郁闷的出纳员 题面 第一行有两个非负整数n和min.n表示下面有多少条命令,min表示工资下界. 接下来的n行,每行表示一条命令.命令可以是以下四种之一: 名称 格式 作用 I命 ...
- bzoj 1503郁闷的出纳员(splay)
1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 11759 Solved: 4163[Submit][Stat ...
- BZOJ 1503 郁闷的出纳员 (treap)
1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 13370 Solved: 4808[Submit][Stat ...
- 洛谷 P1486 BZOJ 1503 NOI 2004 郁闷的出纳员 fhq treap
思路: 1. 此处的fhq treap的分裂是按照权值分裂然后插入的.将小于k的分为一棵子树,大于等于k的分为另一棵子树. 2. 删除的时候只要将大于等于min的分裂到以root为根的树中,另一部分不 ...
- BZOJ 1503 郁闷的出纳员
Description OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常 ...
- BZOJ 1503 郁闷的出纳员(平衡树)(NOI 2004)
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1503 Description OIER公司是一家大型专业化软件公司,有着数以万计的员工.作 ...
- BZOJ 1503 郁闷的出纳员(splay)
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1503 题意:给出一个数列(初始为空),给出一个最小值Min,当数列中的数字小于Min时自动 ...
- 洛谷.1486.[NOI2004]郁闷的出纳员(Splay)
题目链接 /* BZOJ1503: 3164kb 792ms/824ms(新建节点) 洛谷 : 3.06mb 320ms/308ms(前一个要慢wtf 其实都差不多,但前者好写) 四种操作: A:所有 ...
随机推荐
- 黑马旅游网 ajax实现html页面共享
- C# File和fileinfo类
两个类功能差不多,File是静态方法实现的,Fileinfo通过实例方法实现的: 文件操作例子: using System; using System.Collections.Generic; usi ...
- php操作redis和memcache过期时间
php-redis 设置过期时间setTimeOut 命令行expireredis过期时间redis术语里面,把设置了expire time的key 叫做:volatile keys. 意思就是不稳定 ...
- PartTime_20160608
1. http://www.680.com/pojie/398074.html 2. http://www.680.com/pojie/398865.html 3.
- 078 Subsets 子集
给定一组不同的整数 nums,返回所有可能的子集(幂集).注意事项:该解决方案集不能包含重复的子集.例如,如果 nums = [1,2,3],结果为以下答案:[ [3], [1], [2], ...
- (转)CentOS之7与6的区别
CentOS之7与6的区别 原文:http://www.cnblogs.com/Csir/p/6746667.html http://blog.csdn.net/u012562943/article/ ...
- 《java学习三》并发编程 -------线程池原理剖析
阻塞队列与非阻塞队 阻塞队列与普通队列的区别在于,当队列是空的时,从队列中获取元素的操作将会被阻塞,或者当队列是满时,往队列里添加元素的操作会被阻塞.试图从空的阻塞队列中获取元素的线程将会被阻塞,直到 ...
- 在ubuntu 12.04上安装tomcat 7.40
因为源上的版本问题,所以没有使用源上的自动安装包,老规矩,Tomcat 7.0.40 Core下载地址:http://mirror.bit.edu.cn/apache/tomcat/tomcat-7/ ...
- Java设计模式之单例设计模式总结
package singleton; /**单例设计模式 饿汉式 * * @author gx *这种方式基于classloder机制避免了多线程的同步问题,不过,instance在类装载时就实例化, ...
- Google Chrome 浏览器的备用(离线)安装程序
Google Chrome 浏览器的备用(离线)安装程序(适用于 Windows) 如果您在使用 http://www.google.com/chrome 上的标准安装程序下载 Chrome 浏览器时 ...