一 题面

  [NOI2004]郁闷的出纳员

二 分析

  模板题。

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

三 AC代码

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

    题目链接:戳这里 学习题解:戳这里

  2. acm的做题技巧

    1.一般用C语言节约空间,要用C++库函数或STL时才用C++; cout.cin和printf.scanf最好不要混用. 大数据输入输出时最好不要用cin.cout,防止超时. (或加上 1 ios ...

  3. Java开发工程师最新面试题库系列——集合部分(附答案)

    集合 如果你有更好的想法请在评论区留下您的答案,一起交流讨论 说说常见的集合有哪些? 答:主要分List.Set.Map.Queue四类,其中包含ArrayList.LinkedList.HashSe ...

  4. Github markdown页面内跳转

    基本操作: 请看这里 最典型的就是[alt_content](#jump) 但有时, jump是不太好直接看出来的, 比如下面这个标题, 格式复杂, 那如何获取相应的jump呢? 在Github中, ...

  5. JavaScript this All In One

    JavaScript this All In One js, this, bind, call, apply, new, function, arrow function, constructor f ...

  6. Internationalization API & ECMA-402

    Internationalization API & ECMA-402 i18n https://caniuse.com/?search=Internationalization API In ...

  7. LeetCode & Binary Search 解题模版

    LeetCode & Binary Search 解题模版 In computer science, binary search, also known as half-interval se ...

  8. Koa 洋葱模型

    Koa 洋葱模型 let context = { data: [] }; async function middleware1(ctx, next) { console.log('action 001 ...

  9. nasm astrlwr_s函数 x86

    xxx.asm %define p1 ebp+8 %define p2 ebp+12 %define p3 ebp+16 section .text global dllmain export ast ...

  10. 超强嘉宾阵容——NGK Global启动大会圆满举办

    近日,由星盟全球投资公司.灵石团队联合主办的NGK Global全球生态启动大会圆满开幕.大会汇集区块链领域.金融领域.密码学领域.智能算法领域等众多大咖,和NGK Global全球价值共识者共聚一堂 ...