洛谷 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:所有 ...
随机推荐
- jquery中的$(this)和this
在jquery中,存在$(this)和this. 其中常见的是出现在事件处理函数中. 首先先来理解jquery对象. jquery对象其实就是DOM对象的集合. 比如:$('a')[0];------ ...
- 题解 BZOJ 1037 & Luogu P2592 [ZJOI2008]生日聚会
BZOJ & Luogu 老师说是背包?并没看出来QAQ 设f[i][j][o][p]表示已经选了i个人,j个男生,男生比女生最多多o个,女生比男生最多多p个时的方案数 两种转移: <= ...
- Codeforces Round #562 (Div. 2) C. Increasing by Modulo
链接:https://codeforces.com/contest/1169/problem/C 题意: Toad Zitz has an array of integers, each intege ...
- 牛客小白月赛13 G(双向搜索)
AC通道 两边同步搜,一步里面A走一次B走两次,遇到对方走过的地方就得到了答案. #include <bits/stdc++.h> using namespace std; const i ...
- 2017浙江工业大学-校赛决赛 BugZhu抽抽抽!!
Description 当前正火的一款手游阴阳师又出新式神了,BugZhu十分想要获得新出的式神,所以他决定花光所有的积蓄来抽抽抽!BugZhu经过长时间的研究后发现通过画三角外接圆能够提高获得该式神 ...
- Linux修改war包中文件
rm -rf /tmp/wiq.warcp /u02/wms_dev/wiq-app/wars/wiq.war /tmpcd /tmp jar xvf wiq.war vim WEB-INF/clas ...
- Jmeter将JDBC Request查询结果作为下一个接口参数方法
现在有一个需求,从数据库tieba_info表查出rank小于某个值的username和count(*),然后把所有查出来的username和count(*)作为参数值,用于下一个接口. tieba_ ...
- eShopOnContainers(一)
微软微服务架构eShopOnContainers(一) 为了推广.Net Core,微软为我们提供了一个开源Demo-eShopOnContainers,这是一个使用Net Core框架开发的,跨平台 ...
- C#字符串变量使用
string由于是引用类型,所以,声明的字符串变量会存储到堆上,而且该变量是不可变的,一旦初始化了该变量,该内存区域中存储的内容将不能更改.在对字符串操作时,是在堆上创建了一个新的字符串变量,并将新的 ...
- JSTORM中IRichBolt与IBasicBolt的区别