Description

OIER公司是一家大型专业化软件公司,有着数以万计的员工。作为一名出纳员,我的任务之一便是统计每位员工的
工资。这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常调整员工的工资。如果他心情好
,就可能把每位员工的工资加上一个相同的量。反之,如果心情不好,就可能把他们的工资扣除一个相同的量。我
真不知道除了调工资他还做什么其它事情。工资的频繁调整很让员工反感,尤其是集体扣除工资的时候,一旦某位
员工发现自己的工资已经低于了合同规定的工资下界,他就会立刻气愤地离开公司,并且再也不会回来了。每位员
工的工资下界都是统一规定的。每当一个人离开公司,我就要从电脑中把他的工资档案删去,同样,每当公司招聘
了一位新员工,我就得为他新建一个工资档案。老板经常到我这边来询问工资情况,他并不问具体某位员工的工资
情况,而是问现在工资第k多的员工拿多少工资。每当这时,我就不得不对数万个员工进行一次漫长的排序,然后
告诉他答案。好了,现在你已经对我的工作了解不少了。正如你猜的那样,我想请你编一个工资统计程序。怎么样
,不是很困难吧?

Input

第一行有两个非负整数n和min。n表示下面有多少条命令,min表示工资下界。
接下来的n行,每行表示一条命令。命令可以是以下四种之一:
名称 格式 作用
I命令 I_k 新建一个工资档案,初始工资为k。
                如果某员工的初始工资低于工资下界,他将立刻离开公司。
A命令 A_k 把每位员工的工资加上k
S命令 S_k 把每位员工的工资扣除k
F命令 F_k 查询第k多的工资
_(下划线)表示一个空格,I命令、A命令、S命令中的k是一个非负整数,F命令中的k是一个正整数。
在初始时,可以认为公司里一个员工也没有。
I命令的条数不超过100000 
A命令和S命令的总条数不超过100 
F命令的条数不超过100000 
每次工资调整的调整量不超过1000 
新员工的工资不超过100000

Output

输出行数为F命令的条数加一。
对于每条F命令,你的程序要输出一行,仅包含一个整数,为当前工资第k多的员工所拿的工资数,
如果k大于目前员工的数目,则输出-1。
输出文件的最后一行包含一个整数,为离开公司的员工的总数。

Sample Input

9 10
I 60
I 70
S 50
F 2
I 30
S 15
A 5
F 1
F 2

Sample Output

10
20
-1
2
 
又是一道刚了好久的题……思路并不难(可是我板子老打错)
用一个delta来存当前工资修改成什么样了
A的话就delta+
S就delta-
F查询第k多就是查询第(人数-k+1)少
I就是Insert操作。
在每一个操作前,我们要先把低于下限的删掉
操作方法:插入(Min--delta-1),然后把根和左子树删掉
更新一下总人数和总离开人数
 
  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #define MAXN (300000)
  5. using namespace std;
  6. int Cnt[MAXN];
  7. int Size[MAXN];
  8. int Key[MAXN];
  9. int Son[MAXN][];
  10. int Father[MAXN];
  11. int SIZE,ROOT;
  12.  
  13. void Clear(int x)
  14. {
  15. Cnt[x]=Size[x]=Key[x]=Son[x][]=Son[x][]=Father[x]=;
  16. }
  17.  
  18. int Get(int x)
  19. {
  20. return Son[Father[x]][]==x;
  21. }
  22.  
  23. void Update(int x)
  24. {
  25. if (x)
  26. {
  27. Size[x]=Cnt[x];
  28. if (Son[x][]) Size[x]+=Size[Son[x][]];
  29. if (Son[x][]) Size[x]+=Size[Son[x][]];
  30. }
  31. }
  32.  
  33. void Rotate(int x)
  34. {
  35. int fa=Father[x];
  36. int fafa=Father[fa];
  37. int wh=Get(x);
  38. Son[fa][wh]=Son[x][wh^];
  39. Father[fa]=x;
  40. if (Son[fa][wh]) Father[Son[fa][wh]]=fa;
  41. Father[x]=fafa;
  42. Son[x][wh^]=fa;
  43. if (fafa) Son[fafa][Son[fafa][]==fa]=x;
  44. Update(fa);
  45. Update(x);
  46. }
  47.  
  48. void Splay(int x)
  49. {
  50. for (int fa;fa=Father[x];Rotate(x))
  51. if (Father[fa])
  52. Rotate(Get(fa)==Get(x)?fa:x);
  53. ROOT=x;
  54. }
  55.  
  56. int Findx(int x)
  57. {
  58. int now=ROOT;
  59. while ()
  60. {
  61. if (x<=Size[Son[now][]])
  62. now=Son[now][];
  63. else
  64. {
  65. x-=Size[Son[now][]];
  66. if (x<=Cnt[now])
  67. {
  68. Splay(now);
  69. return Key[now];
  70. }
  71. x-=Cnt[now];
  72. now=Son[now][];
  73. }
  74. }
  75. }
  76.  
  77. void Insert(int x)
  78. {
  79. if (ROOT==)
  80. {
  81. ROOT=++SIZE;
  82. Key[SIZE]=x;
  83. Cnt[SIZE]=Size[SIZE]=;
  84. return;
  85. }
  86. int now=ROOT,fa=;
  87. while ()
  88. {
  89. if (Key[now]==x)
  90. {
  91. ++Cnt[now];
  92. Update(now);
  93. Splay(now);
  94. return;
  95. }
  96. fa=now;now=Son[now][x>Key[now]];
  97. if (now==)
  98. {
  99. ++SIZE;
  100. Key[SIZE]=x;
  101. Cnt[SIZE]=Size[SIZE]=;
  102. Father[SIZE]=fa;
  103. Son[fa][x>Key[fa]]=SIZE;
  104. Update(fa);
  105. Splay(SIZE);
  106. return;
  107. }
  108. }
  109. }
  110.  
  111. int main()
  112. {
  113. int delta=,n,Min,x,Sum=,Ans=;
  114. char p;
  115. scanf("%d%d",&n,&Min);
  116. for (int i=;i<=n;++i)
  117. {
  118. Insert(Min-delta-);
  119. Sum-=Size[Son[ROOT][]]+Cnt[ROOT]-;
  120. Ans+=Size[Son[ROOT][]]+Cnt[ROOT]-;
  121. int Oldroot=ROOT;
  122. Father[Son[ROOT][]]=;
  123. ROOT=Son[ROOT][];
  124. Clear(Oldroot);
  125. scanf("\n%c%d",&p,&x);
  126. if (p=='A')
  127. delta+=x;
  128. if (p=='S')
  129. delta-=x;
  130. if (p=='I' && x-delta>=Min-delta)
  131. {
  132. Insert(x-delta);
  133. ++Sum;
  134. }
  135. if (p=='F')
  136. if (Sum>=x)
  137. printf("%d\n",Findx(Sum-x+)+delta);
  138. else
  139. printf("-1\n");
  140. }
  141. printf("%d\n",Ans);
  142. }

1503. [NOI2004]郁闷的出纳员【平衡树-splay】的更多相关文章

  1. 【BZOJ】1503: [NOI2004]郁闷的出纳员(Splay)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1503 这题没有看题解就1a了-好开心,, 其实后面去看题解发现他们的都很麻烦,其实有种很简单的做法: ...

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

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

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

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

  4. 1503: [NOI2004]郁闷的出纳员 (SBT)

    1503: [NOI2004]郁闷的出纳员 http://www.lydsy.com/JudgeOnline/problem.php?id=1503 Time Limit: 5 Sec  Memory ...

  5. bzoj 1503: [NOI2004]郁闷的出纳员 -- 权值线段树

    1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec  Memory Limit: 64 MB Description OIER公司是一家大型专业化软件公司,有着数以万计的员 ...

  6. (WA)BZOJ 1503: [NOI2004]郁闷的出纳员

    二次联通门 : BZOJ 1503: [NOI2004]郁闷的出纳员 /* BZOJ 1503: [NOI2004]郁闷的出纳员 考虑这样一个事实 无论是加或减 都是针对全体人员的 那么只需要记录一个 ...

  7. bzoj 1503: [NOI2004]郁闷的出纳员 Treap

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

  8. BZOJ_1503 [NOI2004]郁闷的出纳员 【Splay树】

    一 题面 [NOI2004]郁闷的出纳员 二 分析 模板题. 对于全部员工的涨工资和跌工资,可以设一个变量存储起来,然后在进行删除时,利用伸展树能把结点旋转到根的特性,能够很方便的删除那些不符合值的点 ...

  9. Luogu P1486 [NOI2004]郁闷的出纳员(平衡树)

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

随机推荐

  1. css3 transition(转换)笔记

    之前transition也用过,大都是ctrl+c,然后ctrl+v,没有了解太详细,这次对transition的应用源自侧边抽屉展开收起的动画效果需要. W3C标准中对css3的transition ...

  2. AngleSharp一些示例

    看到了AngleSharp,感觉这个非常好用,比HtmlAgilityPack感觉好用点 AngleSharp 地址:https://github.com/AngleSharp/AngleSharp ...

  3. 从一个带有http://网络文件中获取文件名

    例如文件网址为: http://a.hiphotos.baidu.com/image/h%3D200/sign=c3da85e50123dd543e73a068e108b3df/80cb39dbb6f ...

  4. 深入理解java虚拟机---4虚拟机类加载机制

    本文来源于翁舒航的博客,点击即可跳转原文观看!!!(被转载或者拷贝走的内容可能缺失图片.视频等原文的内容) 若网站将链接屏蔽,可直接拷贝原文链接到地址栏跳转观看,原文链接:https://www.cn ...

  5. Spring Boot + MyBatis + Druid + Redis + Thymeleaf 整合小结

    Spring Boot + MyBatis + Druid + Redis + Thymeleaf 整合小结 这两天闲着没事想利用**Spring Boot**加上阿里的开源数据连接池**Druid* ...

  6. java的文件操作(1)

    package com.test.file; import java.io.*; import java.util.ArrayList; import java.util.Date; import j ...

  7. Ubuntu双系统环境下隐藏掉其他开机启动项

    系统环境:ubuntu16.04需求:PC装的双系统(ubuntu+win10),为了应对某些需求,需要将win10系统给从电脑上消失,让你看不见也进不去它.做法:当然不可能真的删除掉win10系统, ...

  8. Web前端的状态管理

    背景 我相信很多朋友跟我一样,初次听到什么 Flux ,  Redux ,  Vuex , 状态管理 的时候是一脸懵逼的.因为在外面之前前端大部分开发的时候,根本没有那么多的概念.自从ReactJS火 ...

  9. Android实战——GreenDao3.2的使用,爱不释手

    1前言 GreenDao是一款操作数据库的神器,经过了2.0版本的升级后,已经被广泛的开发者使用.确实是很好用,入门简单,可以剩去了数据库的建表操作和数据库SQL的编写,博主用了一次之后爱不释手,和以 ...

  10. Pwn with File结构体(四)

    前言 前面几篇文章说道,glibc 2.24 对 vtable 做了检测,导致我们不能通过伪造 vtable 来执行代码.今天逛 twitter 时看到了一篇通过绕过 对vtable 的检测 来执行代 ...