题面

看似是要区间修改,然而实际上只需要维护底线和工资的相对大小关系,

瞬间变水

用delta记录对工资的加减,那么添加节点时点权应-delta,输出时+delta

几种操作中减少工资较麻烦:

1.delta-=val;

2.删点

求前驱转到根,删除左子树

这里的删除不用一个一个暴力删,直接断掉子树关系即可

至于求k大 我比较懒直接改成求size-k+1小 (逃)

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. using namespace std;
  5. const int N=1e5+;
  6. int n,fa[N],cnt[N],son[N][],size[N],key[N],type,root;
  7. int line,ans,num,delta;
  8. void clear(int x)
  9. {
  10. fa[x]=cnt[x]=son[x][]=son[x][]=size[x]=key[x]=;
  11. }
  12. bool judge(int x)
  13. {
  14. return son[fa[x]][]==x;
  15. }
  16. void up(int x)
  17. {
  18. if(x)
  19. {
  20. size[x]=cnt[x];
  21. if(son[x][])size[x]+=size[son[x][]];
  22. if(son[x][])size[x]+=size[son[x][]];
  23. }
  24. }
  25. void rotate(int x)
  26. {
  27. int old=fa[x],oldf=fa[old],lr=judge(x);
  28. son[old][lr]=son[x][lr^];
  29. fa[son[old][lr]]=old;
  30. son[x][lr^]=old;
  31. fa[old]=x;
  32. fa[x]=oldf;
  33. if(oldf)son[oldf][son[oldf][]==old]=x;
  34. up(old);up(x);
  35. }
  36. void splay(int x)
  37. {
  38. for(int f;f=fa[x];rotate(x))
  39. if(fa[f])rotate(judge(x)==judge(f)?f:x);
  40. root=x;
  41. }
  42. void ins(int x)
  43. {
  44. if(!root)
  45. {
  46. type++;
  47. key[type]=x;
  48. root=type;
  49. cnt[type]=size[type]=;
  50. fa[type]=son[type][]=son[type][]=;
  51. return ;
  52. }
  53. int now=root,f=;
  54. while()
  55. {
  56. if(x==key[now])
  57. {
  58. cnt[now]++;
  59. up(now);
  60. up(f);
  61. splay(now);
  62. return ;
  63. }
  64. f=now;now=son[now][key[now]<x];
  65. if(!now)
  66. {
  67. type++;
  68. size[type]=cnt[type]=;
  69. son[type][]=son[type][]=;
  70. son[f][x>key[f]]=type;
  71. fa[type]=f;
  72. key[type]=x;
  73. up(f);splay(type);
  74. return ;
  75. }
  76. }
  77. }
  78. int getnum(int x)
  79. {
  80. int now=root;
  81. while()
  82. {
  83. if(son[now][]&&x<=size[son[now][]])now=son[now][];
  84. else
  85. {
  86. int tmp=size[son[now][]]+cnt[now];
  87. if(x<=tmp)
  88. return key[now];
  89. x-=tmp;now=son[now][];
  90. }
  91. }
  92. }
  93. int pre()
  94. {
  95. if(cnt[root]>)return root;
  96. int now=son[root][];
  97. while(son[now][])now=son[now][];
  98. return now;
  99. }
  100. void del(int x)
  101. {
  102. //changeroot(x);
  103. if(cnt[root]>)
  104. {
  105. cnt[root]--;
  106. up(root);
  107. return ;
  108. }
  109. if(!son[root][]&&!son[root][])
  110. {
  111. clear(root);
  112. root=;
  113. return ;
  114. }
  115. if(!son[root][])
  116. {
  117. int old=root;
  118. root=son[root][];
  119. fa[root]=;
  120. clear(old);
  121. return ;
  122. }
  123. else if(!son[root][])
  124. {
  125. int old=root;
  126. root=son[root][];
  127. fa[root]=;
  128. clear(old);
  129. return ;
  130. }
  131. int old=root,L=pre();
  132. splay(L);
  133. son[root][]=son[old][];
  134. fa[son[old][]]=root;
  135. clear(old);
  136. up(root);
  137. }
  138. void del_tree()
  139. {
  140. fa[son[root][]]=;
  141. size[root]-=size[son[root][]];
  142. son[root][]=;
  143. }
  144. inline int read()
  145. {
  146. int x=,f=;char ch=getchar();
  147. while(ch<''||ch>'')
  148. {if(ch=='-')f=-;ch=getchar();}
  149. while(ch>=''&&ch<='')
  150. {x=(x<<)+(x<<)+ch-'';ch=getchar();}
  151. return x*f;
  152. }
  153. int main()
  154. {
  155. n=read();line=read();
  156. char op[];int val;
  157. for(int i=;i<=n;i++)
  158. {
  159. scanf("%s",op);val=read();
  160. switch(op[])
  161. {
  162. case 'I':
  163. if(val<line)break;
  164. else
  165. {
  166. ins(val-delta);
  167. break;
  168. }
  169. case 'A':
  170. delta+=val;break;
  171. case 'S':
  172. delta-=val;
  173. ins(line-delta);
  174. ans+=son[root][]?size[son[root][]]:;
  175. del_tree();
  176. del(val-delta);
  177. break;
  178. case 'F':
  179. if(size[root]<val)puts("-1");
  180. else printf("%d\n",getnum(size[root]-val+)+delta);
  181. break;
  182. }
  183. }
  184. cout<<ans<<endl;
  185. return ;
  186. }

郁闷的出纳员 题解(Splay)的更多相关文章

  1. Luogu1486郁闷的出纳员【Splay】

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

  2. HNOI2004 郁闷的出纳员(Splay)

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

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

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

  4. 【题解】 bzoj1503: [NOI2004]郁闷的出纳员 (Splay)

    bzoj1503,懒得复制,戳我戳我 Solution: 我知不知道我是那根筋抽了突然来做splay,调了起码\(3h+\),到第二天才改出来(我好菜啊),当做训练调错吧 一个裸的splay,没啥好说 ...

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

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

  6. 【NOI2004】郁闷的出纳员(splay)

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

  7. BZOJ1503:[NOI2004]郁闷的出纳员——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=1503 (题面复制的洛谷的,因为洛谷好看) 题目描述 OIER公司是一家大型专业化软件公司,有着数以万 ...

  8. [BZOJ1503]郁闷的出纳员(Splay)

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

  9. BZOJ1503: [NOI2004]郁闷的出纳员(Splay)

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

随机推荐

  1. shell中的四种模式匹配

    POSIX为shell为进行模式匹配提供了四种参数替换结构(老版本的shell可能不支持),每种结构有两个参数:变量名(或变量号)及模式. 第一种模式:    ${variable%pattern}, ...

  2. bzoj2186【SDOI2008】沙拉公主的困惑

    2186: [Sdoi2008]沙拉公主的困惑 Time Limit: 10 Sec  Memory Limit: 259 MB Submit: 2363  Solved: 779 [id=2186& ...

  3. 【大话QT之十四】QT实现多语言切换

    功能需求: 网盘client要可以实现多国语言的切换,第一版要支持中.英文的切换. 在实现过程中感觉QT对多国语言的支持还是非常不错的.制作多语言包非常方便.切换的逻辑也非常easy. 以下就来看一下 ...

  4. css中合理的使用nth-child实现布局

    写这篇文章的目的.主要是今天要实现一个布局:li.每行三个,总数不定.仅仅能相邻的li之间须要10px的间距.效果例如以下图: watermark/2/text/aHR0cDovL2Jsb2cuY3N ...

  5. Date类型转换为Integer类型

    Date类型转换为Integer类型: Integer date = Integer.valueOf(String.valueOf(new SimpleDateFormat("yyyyMMd ...

  6. 微软公有云Azure是惠及全人类的计算资源

    回归往事,1975年,微软以DOS创业.在随后的三十年中,微软给人类贡献了视窗操作系统Windows,至今,人们对桌面操作系统XP仍然不离不弃.可是,面对互联网的兴起.微软应该怎么办呢? 微软内部不乏 ...

  7. Codeforces Round #327 (Div. 2)C. Median Smoothing 构造

    C. Median Smoothing   A schoolboy named Vasya loves reading books on programming and mathematics. He ...

  8. Polymorphism (C# Programming Guide)

    https://msdn.microsoft.com/en-us/library/ms173152.aspx Polymorphism is often referred to as the thir ...

  9. yistack

  10. 解决 EF where<T>(func) 查询的一个性能问题

    前两年帮朋友 做了个网吧管理软件,采用动软的三层架构 sql语句生成的.最近因功能变更 要改动,而我这段正在做asp.net mvc +ef+autofac的一个电商网站.索性 就把原来的底层全重新了 ...