题解【bzoj1503 [NOI2004]郁闷的出纳员】
Description
给出一个下限 \(m\) ,要求维护以下操作
- 插入一个数(如果小于下限就不加)
- 给每个数加上一个数
- 给每个数减去一个数,并且删除掉 \(< m\) 的所有数
- 求目前第 \(k\) 大的数(注意是第 \(k\) 大!从大到小排序后第 \(k\) 个)
最后还要输出所有 3 操作一共删掉了多少个数
\(n \leq 10^5\)
Solution
fhqtreap大法吼!
由于修改操作是全体操作,可以用一个 \(delta\) 记录修改总量
对于 1 操作插入权值 \(x - delta\)(如果 x <= m 就算了
对于 2 操作直接把 \(delta += x\)
对于 3 操作,先把 \(delta -= x\) ,然后把小于 \(m - delta\) 的全部删掉
具体实现可以 split 出来两个子树,然后直接让 root = 右子树,最后要输出的 ans += 左子树的 siz
对于 4 操作,split一下就行了
Code
#include <bits/stdc++.h>
using namespace std;
const int N = 100100;
int n, m, delta;
struct node {
int d, rnd, siz;
node *ch[2];
inline void upd() {
int ret = 1; if(ch[0]) ret += ch[0]->siz;
if(ch[1]) ret += ch[1]->siz; siz = ret;
}
}pool[N], *cur = pool, *root;
inline int siz(node *p) { return p ? p->siz : 0; }
inline node *New(int d) { node *p = (cur++); p->d = d, p->siz = 1, p->rnd = rand(); return p; }
inline node *merge(node *p, node *q) {
if(!p || !q) return p ? p : q;
if(p->rnd < q->rnd) { p->ch[1] = merge(p->ch[1], q); p->upd(); return p; }
if(p->rnd >= q->rnd) { q->ch[0] = merge(p, q->ch[0]); q->upd(); return q; }
return 0;
}
inline void split(node *r, int k, node *&p, node *&q) {
if(!r) { p = q = 0; return ; }
if(siz(r->ch[0]) >= k) q = r, split(r->ch[0], k, p, r->ch[0]);
else p = r, split(r->ch[1], k - siz(p->ch[0]) - 1, r->ch[1], q); r->upd();
}
inline int rk(node *r, int x) {
return !r ? 0 : (r->d >= x ? rk(r->ch[0], x) : (siz(r->ch[0]) + 1 + rk(r->ch[1], x)));
}
inline node *del(int x) {
int k = rk(root, x); node *p, *q;
split(root, k, p, q); root = q; return p;
}
int main() { int ans = 0;
scanf("%d %d", &n, &m);
for(int i = 1; i <= n; i++) {
char op[5]; int d;
scanf("%s %d", op, &d);
if(op[0] == 'I') {
if(d < m) continue ;
if(!root) { root = New(d - delta); continue ; }
node *p, *q; split(root, rk(root, d - delta), p, q);
root = merge(merge(p, New(d - delta)), q);
} else if(op[0] == 'A') delta += d;
else if(op[0] == 'S') {
delta -= d; node *p = del(m - delta);
ans += siz(p);
} else {
// printf("%d\n", siz(root));
if(siz(root) < d) { printf("-1\n"); continue ; }
int sizz = siz(root);
node *p, *q, *r; split(root, (sizz - d + 1) - 1, p, q);
split(q, 1, q, r); printf("%d\n", q->d + delta); root = merge(merge(p, q), r);
}
} printf("%d\n", ans);
return 0;
}
题解【bzoj1503 [NOI2004]郁闷的出纳员】的更多相关文章
- [BZOJ1503][NOI2004]郁闷的出纳员
[BZOJ1503][NOI2004]郁闷的出纳员 试题描述 OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是 ...
- [BZOJ1503][NOI2004]郁闷的出纳员 无旋Treap
1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec Memory Limit: 64 MB Description OIER公司是一家大型专业化软件公司,有着数以万计的员 ...
- bzoj1503: [NOI2004]郁闷的出纳员(伸展树)
1503: [NOI2004]郁闷的出纳员 题目:传送门 题解: 修改操作一共不超过100 直接暴力在伸展树上修改 代码: #include<cstdio> #include<cst ...
- bzoj1503 [NOI2004]郁闷的出纳员(名次树+懒惰标记)
1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 8705 Solved: 3027[Submit][Statu ...
- 【题解】 bzoj1503: [NOI2004]郁闷的出纳员 (Splay)
bzoj1503,懒得复制,戳我戳我 Solution: 我知不知道我是那根筋抽了突然来做splay,调了起码\(3h+\),到第二天才改出来(我好菜啊),当做训练调错吧 一个裸的splay,没啥好说 ...
- [BZOJ1503] [NOI2004] 郁闷的出纳员 (treap)
Description OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常 ...
- BZOJ1503[NOI2004]郁闷的出纳员——treap
OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常调整员工的工资.如果他心 ...
- [luogu1486][bzoj1503][NOI2004]郁闷的出纳员【平衡树treap】
题目描述 OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常调整员工的工资 ...
- BZOJ1503 [NOI2004]郁闷的出纳员 splay
原文链接http://www.cnblogs.com/zhouzhendong/p/8086240.html 题目传送门 - BZOJ1503 题意概括 如果某一个员工的工资低于了min,那么,他会立 ...
随机推荐
- Python中collections模块的使用
本文将详细讲解collections模块中的所有类,和每个类中的方法,从源码和性能的角度剖析. 一个模块主要用来干嘛,有哪些类可以使用,看__init__.py就知道 '''This module i ...
- OO学习总结与体会
前言 经过了对于面向对象程序设计的一个月的学习,我初尝了JAVA以及面向对象程序的魅力.经历了三次难度逐渐加大的课后编程作业,我对于工程化面向对象编程以及调试有了深刻的认识与颇多感想.我写下本篇文章以 ...
- OO最后一次总结
测试与正确性论证 Dijkstra说过:“程序测试只能证明程序有错,不能证明程序正确.”所谓程序测试,实际上是测试者特意挑出一批检查数据,通过运行程序,检查每个输入数据所对应的运行结果是否符合预期要求 ...
- 20162319 实验四 Android程序设计
Android Stuidio的安装测试: 完成Hello World, 要求修改res目录中的内容,Hello World后要显示自己的学号 ·实验过程 完成任务一,只需在Android应用程序文件 ...
- 转载 intellij IDEA 使用体验 (本人感觉它的使用是一种趋势)
从去年开始转java以来,一直在寻找一款趁手的兵器,eclipse虽然是很多java程序员的首选,但是我发现一旦安装了一些插件,workspace中的项目达到数10个以后,经常崩溃,实在影响编程的心情 ...
- The Begining
学习记录之旅,就此开始.软件工程,Java神马的统统到我碗里来.
- 啊啊啊 草蛋啊 之前努力一天搞出来的时间算法 被一句pk掉 给我砖头
package yun3; import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.Cale ...
- Monty Hall 问题与贝叶斯定理的理解
三门问题(Monty Hall problem),是一个源自博弈论的数学游戏问题,大致出自美国的电视游戏节目Let's Make a Deal.问题的名字来自该节目的主持人蒙提·霍尔(Monty H ...
- PHP 内置函数strlen 和mbstring扩展函数mb_strlen的区别
#EXAMPLE $str_uncode = "简体中文Chinese(Simplified)"; //统计字符串长度 echo strlen($str_uncode).'< ...
- [转帖] 红帽8.0 beta版本发布 内核新版本 4.18
Red Hat Enterprise Linux 8 Beta 现已发布! https://www.oschina.net/news/101870/red-hat-enterprise-linux-8 ...