【BZOJ 1503】【NOI 2004】郁闷的出纳员
$Splay$模板题。
复习一下伸展树的模板。
一定不要忘了push啊!!!
对于减工资后删掉员工的操作,我选择插入一个$min+delta_{减少的工资}$的节点,把它$Splay$到根,砍掉它自己和左子树,保留右子树,这样该走的员工就会从这个世界上消失啦~~~
#include<cstdio>
#include<cstring>
#include<algorithm>
#define read(x) x = getint()
using namespace std;
struct node {
node *ch[2], *fa;
int d, sz, sum, lazy;
bool pl() {return this->fa->ch[1] == this;}
void setc(node *r, bool c) {ch[c] = r; r->fa = this;}
void count() {sum = ch[0]->sum + ch[1]->sum + sz;}
void push() {
if (lazy != 0) {
ch[0]->lazy += lazy;
ch[1]->lazy += lazy;
ch[0]->d += lazy;
ch[1]->d += lazy;
lazy = 0;
}
}
}*ROOT, *null;
node pool[100003];
int top = 0, M, n, gone = 0;
namespace Splay{
void Build() {
null = &pool[0];
null->d = null->sz = null->sum = 0;
null->ch[0] = null->ch[1] = null->fa = null;
ROOT = null;
}
node *newnode() {
node *t = &pool[++top];
t->d = t->sz = t->sum = 0;
t->ch[0] = t->ch[1] = t->fa = null;
return t;
}
void rotate(node *r) {
node *f = r->fa; if (r == null || f == null) return;
bool c = r->pl();
if (f->fa == null) ROOT = r, r->fa = null;
else f->fa->setc(r, f->pl());
f->setc(r->ch[!c], c);
r->setc(f, !c);
f->count();
}
void update(node *r) {if (r != ROOT) update(r->fa); r->push();}
void splay(node *r, node *tar = null) {
update(r);
for(; r->fa != tar; rotate(r))
if (r->fa->fa != tar) rotate(r->pl() == r->fa->pl() ? r->fa : r);
r->count();
}
void ins(int num) {
if (ROOT == null) {
ROOT = newnode();
ROOT->d = num;
ROOT->sz = ROOT->sum = 1;
return;
}
node *r = ROOT;
while (1) {
r->push();
int k = r->d; bool c;
if (num < k) c = 0;
else if (num > k) c = 1;
else {++r->sz; ++r->sum; splay(r); return;}
if (r->ch[c] == null) {
r->ch[c] = newnode();
r->setc(r->ch[c], c);
r->ch[c]->sz = r->ch[c]->sum = 1;
r->ch[c]->d = num;
splay(r->ch[c]);
return;
} else r = r->ch[c];
}
}
void ins2(int num) {
node *r = ROOT; bool c;
while (1) {
r->push();
if (num <= r->d) c = 0;
else c = 1;
if (r->ch[c] == null) {
r->ch[c] = newnode();
r->setc(r->ch[c], c);
splay(r->ch[c]);
gone += ROOT->ch[0]->sum;
ROOT->ch[1]->fa = null;
ROOT = ROOT->ch[1];
return;
} else r = r->ch[c];
}
}
int kth(int k) {
node *r = ROOT;
while (r != null) {
r->push();
if (r->ch[1]->sum >= k) r = r->ch[1];
else if (r->ch[1]->sum + r->sz >= k) return r->d;
else k -= r->ch[1]->sum + r->sz, r = r->ch[0];
}
return 0;
}
} inline int getint() {
int k = 0, fh = 1; char c = getchar();
for(; c < '0' || c > '9'; c = getchar())
if (c == '-') fh = -1;
for(; c >= '0' && c <= '9'; c = getchar())
k = k * 10 + c - '0';
return k * fh;
}
int main() {
Splay::Build();
read(n); read(M);
int num;
for(int i = 1; i <= n; ++i) {
char c = getchar(); while (c < 'A' || c > 'Z') c = getchar();
switch (c) {
case 'I':
read(num);
if (num >= M)
Splay::ins(num);
break;
case 'A':
read(num);
ROOT->d += num;
ROOT->lazy += num;
ROOT->push();
break;
case 'S':
read(num);
Splay::ins2(num + M);
ROOT->d -= num;
ROOT->lazy -= num;
ROOT->push();
break;
case 'F':
read(num);
if (num > ROOT->sum) puts("-1");
else printf("%d\n", Splay::kth(num));
break;
}
}
printf("%d\n", gone);
return 0;
}
【BZOJ 1503】【NOI 2004】郁闷的出纳员的更多相关文章
- [bzoj 1503][NOI 2004]郁闷的出纳员(平衡树)
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1503 分析: 经典的平衡树题,我用Treap做的 下面有几点注意的: 1.可能出现新加入的人的 ...
- 洛谷 P1486 BZOJ 1503 NOI 2004 郁闷的出纳员 fhq treap
思路: 1. 此处的fhq treap的分裂是按照权值分裂然后插入的.将小于k的分为一棵子树,大于等于k的分为另一棵子树. 2. 删除的时候只要将大于等于min的分裂到以root为根的树中,另一部分不 ...
- bzoj 1503[NOI 2004] 郁闷的出纳员
题目大意: 给4种操作 I:添加一个员工工资信息 A:增加所有员工的工资 S:减少所有员工的工资 F:询问工资第k高的员工的工资情况 自己做的第一道splay树的题目,初学找找感觉 #include ...
- 数据结构(跳跃表):NOI 2004 郁闷的出纳员
郁闷的出纳员 [问题描述] OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常, ...
- NOI 2004 郁闷的出纳员(平衡树)
题目描述 OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常调整员工的工资 ...
- NOI 2004 郁闷的出纳员
Description OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常 ...
- 【BZOJ 1503】[NOI2004]郁闷的出纳员
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 因为所有人工资同时递减. 所以可以设置一个变化值delta. 然后每个人的初始值为k 则把k-delta加入伸展树中. 会发现del ...
- 【NOI】2004 郁闷的出纳员
[算法]平衡树(treap) [题解] treap知识见数据结构. 解法,具体细节见程序. #include<cstdio> #include<algorithm> #incl ...
- 【BZOJ】【1503】 【NOI2004】郁闷的出纳员
Splay Splay的模板题吧……妥妥的序列操作= =(好像有段时间没写过这种纯数据结构题了……) /************************************************ ...
- bzoj 1503郁闷的出纳员(splay)
1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 11759 Solved: 4163[Submit][Stat ...
随机推荐
- Golang tips
1.go test 测试单个函数 go test -v -test.run Test* 2.
- UVA 12169 Disgruntled Judge【扩展欧几里德】
题意:随机选取x1,a,b,根据公式xi=(a*xi-1+b)%10001得到一个长度为2*n的序列,奇数项作为输入,求偶数项,若有多种,随机输出一组答案. 思路:a和b均未知,可以考虑枚举a和b,时 ...
- 用ccproxy + stunnel做个加密代理
https://www.stunnel.org/downloads.html ccproxy + stunnel做个加密http代理和socks5代理 目前国内用户无法访问某些国外网站,如http:/ ...
- 收集入侵Windows系统的证据
随着网络的不断扩大,网络安全更加会成为人们的一个焦点,同时也成为是否能进一步投入到更深更广领域的一个基石.当然网络的安全也是一个动态的概念,世界上没有绝对安全的网络,只有相对安全的网络.相对安全环境的 ...
- canvas时钟
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- nginx反向代理tomcat访问时浏览器加载失败,出现 ERR_CONTENT_LENGTH_MISMATCH 问题
问题说明:测试机上部署了一套业务环境,nginx反向代理tomcat,在访问时长时间处于加载中,十分缓慢! 通过浏览器调试(F12键->Console),发现有错误ERR_CONTENT_LEN ...
- windows live Writer test
package com.newegg.shopping.util.listener; import javax.servlet.http.HttpSessionAttributeListener; i ...
- 利用Weblogic的iisproxy、iisforward插件实现IIS转发
默认情况下,IIS只能提供http重定向功能,而无法满足转发需求. 举例:http://localhost/app1 利用http重定向到 http://www.abc.com/app1 访问 htt ...
- python 播放 wav 文件
未使用其他库, 只是使用 pywin32 调用系统底层 API 播放 wav 文件. # Our raison d'etre - playing sounds import pywintypes im ...
- Ionic实战四:ionic 即时通讯_ionic仿雅虎邮箱
此产品是一款Ionic版微博.微信.朋友圈效果(微博.微信.聊天列表.聊天窗口.个人界面.编辑个人信息等)购买后二次开发方便快捷.