$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】郁闷的出纳员的更多相关文章

  1. [bzoj 1503][NOI 2004]郁闷的出纳员(平衡树)

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1503 分析: 经典的平衡树题,我用Treap做的 下面有几点注意的: 1.可能出现新加入的人的 ...

  2. 洛谷 P1486 BZOJ 1503 NOI 2004 郁闷的出纳员 fhq treap

    思路: 1. 此处的fhq treap的分裂是按照权值分裂然后插入的.将小于k的分为一棵子树,大于等于k的分为另一棵子树. 2. 删除的时候只要将大于等于min的分裂到以root为根的树中,另一部分不 ...

  3. bzoj 1503[NOI 2004] 郁闷的出纳员

    题目大意: 给4种操作 I:添加一个员工工资信息 A:增加所有员工的工资 S:减少所有员工的工资 F:询问工资第k高的员工的工资情况 自己做的第一道splay树的题目,初学找找感觉 #include ...

  4. 数据结构(跳跃表):NOI 2004 郁闷的出纳员

    郁闷的出纳员 [问题描述] OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常, ...

  5. NOI 2004 郁闷的出纳员(平衡树)

    题目描述 OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常调整员工的工资 ...

  6. NOI 2004 郁闷的出纳员

    Description OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常 ...

  7. 【BZOJ 1503】[NOI2004]郁闷的出纳员

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 因为所有人工资同时递减. 所以可以设置一个变化值delta. 然后每个人的初始值为k 则把k-delta加入伸展树中. 会发现del ...

  8. 【NOI】2004 郁闷的出纳员

    [算法]平衡树(treap) [题解] treap知识见数据结构. 解法,具体细节见程序. #include<cstdio> #include<algorithm> #incl ...

  9. 【BZOJ】【1503】 【NOI2004】郁闷的出纳员

    Splay Splay的模板题吧……妥妥的序列操作= =(好像有段时间没写过这种纯数据结构题了……) /************************************************ ...

  10. bzoj 1503郁闷的出纳员(splay)

    1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 11759  Solved: 4163[Submit][Stat ...

随机推荐

  1. JavaScript Math 对象

    JavaScript Math 对象 Math 对象 Math 对象用于执行数学任务. Math 对象并不像 Date 和 String 那样是对象的类,因此没有构造函数 Math(). 语法 var ...

  2. JavaScript Date 对象

    JavaScript Date 对象 Date 对象 Date 对象用于处理日期与实际. 创建 Date 对象: new Date(). 以上四种方法同样可以创建 Date 对象: var d = n ...

  3. zepto阻止事件冒泡

    $("#model_frame").on("click",function(){ $(this).hide(); console.log($(this)); } ...

  4. php 中的curl

    ① curl上传文件 <?php $postData=array( 'name'=>'123', 'upload'=>'@E:/wamp/www/function/result.zi ...

  5. iOS - 用 UIBezierPath 实现果冻效果

    最近在网上看到一个很酷的下拉刷新效果(http://iostuts.io/2015/10/17/elastic-bounce-using-uibezierpath-and-pan-gesture/). ...

  6. MathType 公式后的空格问题

    注册表编辑器修改 Windows Registry Editor Version 5.00 [HKEY_CURRENT_USER\Software\Design Science\DSMT6\WordC ...

  7. [转]各种有用的PHP开源库精心收集

    FROM : http://my.oschina.net/caroltc/blog/324024 1.html2ps and html2pdf    下载地址: http://www.tufat.co ...

  8. 单页面网站关于id冲突的解决办法

    最近做了一个单页面的网站,所有的页面加载都是通过局部刷新的方式,并且不用iframe,并且我们引入了动态tab页签: 所有的页签里的内容都只是一个元素,都在同一个html页面上,没有任何iframe分 ...

  9. script实现的日期表示

    function clockon(bgclock){ var now=new Date(); var year=now.getYear(); var month=now.getMonth(); var ...

  10. JS多异步之间的协作方案

    场景:使用工具函数downloadAllAsync接收一个URL数组并下载所有文件,结果返回一个存储了文件内容的数组,每个URL对应一个字符串. 好处:downloadAllAsync并不只有清理嵌套 ...