一 题面

  [NOI2004]郁闷的出纳员

二 分析

  模板题。

  对于全部员工的涨工资和跌工资,可以设一个变量存储起来,然后在进行删除时,利用伸展树能把结点旋转到根的特性,能够很方便的删除那些不符合值的点。同时,维护的结点数量信息也方便我们进行结果的统计。

三 AC代码

  1 #include <cstdio>
2 #include <cstring>
3 #include <algorithm>
4 #include <iostream>
5 #include <fstream>
6 using namespace std;
7
8 const int MAXN = 1e5 + 15;
9 class Splay
10 {
11 public:
12 struct Node
13 {
14 Node *ch[2], *fa;
15 int size, key;
16 Node(){
17 ch[0] = ch[1] = fa = NULL;
18 key = size = 0;
19 }
20 void setc(Node *p, bool d){
21 ch[d] = p;
22 p->fa = this;
23 }
24 //判断是父节点的哪个孩子结点
25 bool d(){
26 //是父节点的有儿子
27 return fa->ch[1] == this;
28 }
29 void push_up(){
30 size = ch[0]->size + ch[1]->size + 1;
31 }
32 }*null, *root;
33 Splay(){
34 null = new Node;
35 null->ch[0] = null->ch[1] = null->fa = null;
36 root = null;
37 }
38 void rotate(Node *rt){
39 Node* fa = rt->fa;
40 bool d = rt->d();
41 fa->fa->setc(rt, fa->d());
42 fa->setc(rt->ch[!d], d);
43 rt->setc(fa, !d);
44 fa->push_up();
45 if(root == fa) root = rt;
46 }
47 Node* newNode(const int &key){
48 Node* rt = new Node();
49 rt->key = key;
50 rt->size = 1;
51 rt->ch[0] = rt->ch[1] = rt->fa = null;
52 return rt;
53 }
54 void splay(Node* rt, Node* fa){
55 while(rt->fa != fa){
56 if(rt->fa->fa == fa)
57 rotate(rt);
58 else{
59 //容易出错的位置
60 rt->d() == rt->fa->d() ? rotate(rt->fa) : rotate(rt);
61 rotate(rt);
62 }
63 }
64 rt->push_up();
65 }
66 void insert(const int &key){
67 if(root == null){
68 root = newNode(key);
69 return;
70 }
71 Node* t = root;
72 while(t->ch[key > t->key] != null)
73 t = t->ch[key > t->key];
74 Node* c = newNode(key);
75 t->setc(c, key > t->key);
76 t->push_up();
77 splay(c, null);
78 }
79 Node* get_kth(Node* rt, int k){
80 Node* x = rt;
81 if(x == null)
82 return null;
83 while(x->ch[0]->size + 1 != k){
84 if(k < x->ch[0]->size + 1)
85 x = x->ch[0];
86 else{
87 k -= x->ch[0]->size + 1;
88 x = x->ch[1];
89 }
90 }
91 return x;
92 }
93 };
94
95 int main()
96 {
97 //freopen("input.txt", "r", stdin);
98 //freopen("out.txt", "w", stdout);
99 int n, min, k;
100 int data = 0, Cnt = 0;
101 char c;
102 Splay sptree;
103 scanf("%d %d", &n, &min);
104 while(n--){
105 getchar();
106 scanf("%c %d", &c, &k);
107 if(c == 'I'){
108 if(k < min)
109 continue;
110 sptree.insert(k+data);
111 }
112 else if(c == 'A'){
113 data -= k;
114 }
115 else if(c == 'S'){
116 data += k;
117 sptree.insert(min+data);
118 Cnt += sptree.root->ch[0]->size;
119 sptree.root=sptree.root->ch[1];
120 sptree.root->fa = sptree.null;
121 }
122 else{
123 if(k > sptree.root->size)
124 printf("-1\n");
125 else{
126 k = sptree.root->size - k + 1;
127 printf("%d\n", sptree.get_kth(sptree.root, k)->key-data);
128 }
129 }
130 }
131 printf("%d\n", Cnt);
132 return 0;
133 }

BZOJ_1503 [NOI2004]郁闷的出纳员 【Splay树】的更多相关文章

  1. BZOJ 1503: [NOI2004]郁闷的出纳员 splay

    1503: [NOI2004]郁闷的出纳员 Description OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作 ...

  2. NOI2004 郁闷的出纳员 Splay

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

  3. 【BZOJ1503】 [NOI2004]郁闷的出纳员 splay

    splay模板题,都快把我做忧郁了. 由于自己调两个坑点. 1.删除时及时updata 2.Kth 考虑k满足该点的条件即r->ch[1]->size+1<=k && ...

  4. 洛谷P1486 [NOI2004]郁闷的出纳员(splay)

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

  5. BZOJ1503 [NOI2004]郁闷的出纳员 splay

    原文链接http://www.cnblogs.com/zhouzhendong/p/8086240.html 题目传送门 - BZOJ1503 题意概括 如果某一个员工的工资低于了min,那么,他会立 ...

  6. 洛谷.1486.[NOI2004]郁闷的出纳员(Splay)

    题目链接 /* BZOJ1503: 3164kb 792ms/824ms(新建节点) 洛谷 : 3.06mb 320ms/308ms(前一个要慢wtf 其实都差不多,但前者好写) 四种操作: A:所有 ...

  7. bzoj1503[NOI2004]郁闷的出纳员——Splay

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1503 好奇怪呀!为什么而TLE? 各种修改终于卡时过了.可是大家比我快多了呀?难道是因为自己 ...

  8. BZOJ[NOI2004]郁闷的出纳员 | Splay板子题

    题目: 洛谷也能评测....还有我wa了10多次的记录233 题解: 不要想得太复杂,搞一个全局变量记录一下工资的改变量Delta,这样可以等询问的时候就输出val+Delta,然后插入的时候插入x- ...

  9. bzoj1503 [NOI2004]郁闷的出纳员(名次树+懒惰标记)

    1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 8705  Solved: 3027[Submit][Statu ...

随机推荐

  1. kubernetes跑jenkins动态slave

    使用jenkins动态slave的优势: 服务高可用,当 Jenkins Master 出现故障时,Kubernetes 会自动创建一个新的 Jenkins Master 容器,并且将 Volume ...

  2. C# 类 (5)

    Static 静态成员 创建一个类,实例化它,然后使用实例的各种方法或者属性 然而有时候我们不想实例化这个类,难道我们就没法用他里面的成员了吗?比如计算矩形的面积,就是长*宽,万年不变 当然可以,用s ...

  3. Mybatis基础:Mybatis映射配置文件,Mybatis核心配置文件,Mybatis传统方式开发

    一.Mybatis快速入门 1.1 框架介绍 框架是一款半成品软件,我们可以基于这个半成品软件继续开发,来完成我们个性化的需求! 框架:大工具,我们利用工具,可以快速开发项目 (mybatis也是一个 ...

  4. u-boot 移植 --->7、u-bootl流程粗线条梳理

    通过前面的调试了解到s5pv210这个芯片的启动流程是需要将u-boot分为两部分的分别为SPL和u-boot.这里我使用网上的方式不直接使用u-boot的SPL连接脚本单独生成SPL的image而是 ...

  5. Kconfig 配置文件编码规则

    最早接触到Kconfig是在u-boot的移植过程中.所今天来好好学习一下如何编写一个符合Kconffigde 配置文件.Kbuild或者是Kconfig的中文翻译意思是内核配置/构建系统.他最早出自 ...

  6. windows10 浏览器跑分对比!

    2015-12-12 windows10 浏览器跑分对比! YOUR BROWSER SCORES!                MaxScore=555http://html5test.com/i ...

  7. 使用 js 实现一个简易版的 async 库

    使用 js 实现一个简易版的 async 库 具有挑战性的前端面试题 series & parallel 串行,并行 refs https://www.infoq.cn/article/0NU ...

  8. Python Coding Interview

    Python Coding Interview Python Advanced Use enumerate() to iterate over both indices and values Debu ...

  9. ORM All In One

    ORM All In One ORM Object Relational Mapping https://en.wikipedia.org/wiki/Object-relational_mapping ...

  10. D3 tree map

    D3 tree map D3 矩形树图 https://www.zhihu.com/question/55529379 https://zhuanlan.zhihu.com/p/57873460 ht ...