洛谷 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:所有 ...
随机推荐
- blur和focus的运用
这两个事件不仅仅只能运用与input.span之类的元素.还可以运用于window. 可以切换title. 当切换当前页面时,改变title的文字为‘离开了’. <!DOCTYPE html&g ...
- PAT刷题记录
1. 1007 素数对猜想 :运行超时 算法问题还是语言本身效率低下? import math def is_prime(num): if num == 2: return num temp = in ...
- HDU 5875 H - Function 用单调栈水过了
http://acm.hdu.edu.cn/showproblem.php?pid=5875 单调栈,预处理to[i]表示第一个比a[i]小的数字,一直跳就可以. 这题是数据水而已. 这里学习下单调栈 ...
- MS SqlServer之Exec和EXEC SP_EXECUTESQL
exec执行sql时字符串时,不能给变量赋值,如果要在sql里给变量赋值,请用EXEC SP_EXECUTESQL 示例: 通过 SP_EXECUTESQL 的第2个参数来定义有哪些参数 输出的加OU ...
- Spark Mllib里如何建立密集向量和稀疏向量(图文详解)
不多说,直接上干货! 具体,见 Spark Mllib机器学习实战的第4章 Mllib基本数据类型和Mllib数理统计
- scp 可以在 2个 linux 主机间复制文件
Linux scp命令用于Linux之间复制文件和目录,具体如何使用这里好好介绍一下,从本地复制到远程.从远程复制到本地是两种使用方式.这里有具体举例: ================== Linu ...
- 通过代码理解Asp.net4中的几种ClientIDMode设置.
以前我们可以通过ClientID在JavaScript脚本中服务器端控件.比如: document.getElementById("<%=控件.ClientID %>" ...
- Php—AJAX跨域问题
<?php /** * ajax proxy * ajax跨域解决办法 * @author suconghou <suconghou@126.com> * @version v1. ...
- SpringBoot 2.x (15):Actuator监控
Actuator监控:SpringBoot自带的,对生成环境进行监控的系统 使用:既然是监控,那就不能监控一个空项目 这里我使用SpringBoot整合MyBatis的Demo: https://ww ...
- python中的getcwd
Help on built-in function getcwd in module posix: getcwd(...) getcwd() -> path Return a ...