记录编号 283692 评测结果 AAAAAAAAAA
题目名称 [NOI 2004]郁闷的出纳员 最终得分 100
用户昵称 Gravatar安呐一条小咸鱼。 是否通过 通过
代码语言 C++ 运行时间 1.089 s
提交时间 2016-07-15 10:49:15 内存使用 1.84 MiB
显示代码纯文本
  1. #include<iostream>
  2. #include<cstdio>
  3. using namespace std;
  4. const int maxn=100001;
  5. int lower;//最低工资;
  6. int add_pay=0;
  7. int c_num=0;
  8. int front=0;
  9. struct Node
  10. {
  11. int key,size,llink,rlink;
  12. }number[maxn];
  13. void LeftRotate(int &x)//左旋
  14. {
  15. int y=number[x].rlink;
  16. if(y==0)return;
  17. number[x].rlink=number[y].llink;
  18. number[y].llink=x;
  19. number[y].size=number[x].size;
  20. number[x].size=number[number[x].llink].size+number[number[x].rlink].size+1;
  21. x=y;
  22. }
  23. void RightRotate(int &x)//右旋
  24. {
  25. int y=number[x].llink;
  26. if(y==0)return;
  27. number[x].llink=number[y].rlink;
  28. number[y].rlink=x;
  29. number[y].size=number[x].size;
  30. number[x].size=number[number[x].llink].size+number[number[x].rlink].size+1;
  31. x=y;
  32. }
  33. void Maintain(int &root,bool flag)//维护SBT树
  34. {
  35. if(!root)return;
  36. if(flag)
  37. {
  38. if(number[root].llink&&number[number[root].llink].llink&&
  39. (!number[root].rlink||number[number[number[root].llink].llink].size>number[number[root].rlink].size))
  40. {
  41. RightRotate(root);
  42. }
  43. else if(number[root].llink&&number[number[root].llink].rlink&&
  44. (!number[root].rlink||number[number[number[root].llink].rlink].size>number[number[root].rlink].size))
  45. {
  46. LeftRotate(number[root].llink);
  47. RightRotate(root);
  48. }
  49. else return;
  50. }
  51. else
  52. {
  53. if(number[root].rlink&&number[number[root].rlink].rlink&&
  54. (!number[root].llink||number[number[number[root].rlink].rlink].size>number[number[root].llink].size))
  55. {
  56. LeftRotate(root);
  57. }
  58. else if(number[root].rlink&&number[number[root].rlink].llink&&
  59. (!number[root].llink||number[number[number[root].rlink].llink].size>number[number[root].llink].size))
  60. {
  61. RightRotate(number[root].rlink);
  62. LeftRotate(root);
  63. }
  64. else return;
  65. }
  66. Maintain(number[root].llink,true);
  67. Maintain(number[root].rlink,false);
  68. Maintain(root,true);
  69. Maintain(root,false);
  70. }
  71. int Delete(int &root)
  72. {
  73. int t=0,sum=0;
  74. if(!root)return root;
  75. if(number[root].key+add_pay<lower)
  76. {
  77. sum+=number[number[root].llink].size+1;
  78. number[root].size-=sum;
  79. number[root].llink=0;
  80. t=Delete(number[root].rlink);
  81. sum+=t;
  82. number[root].size-=t;
  83. number[number[root].rlink].size=number[root].size;
  84. root=number[root].rlink;
  85. }
  86. else
  87. {
  88. t=Delete(number[root].llink);
  89. sum=t;
  90. number[root].size-=t;
  91. }
  92. return sum;
  93. }
  94. void Insert(int &root,int x)
  95. {
  96. if(!root)
  97. {
  98. root=++front;
  99. number[root].key=x;
  100. number[root].size=1;
  101. }
  102. else
  103. {
  104. number[root].size++;
  105. Insert(x<=number[root].key?number[root].llink:number[root].rlink,x);
  106. Maintain(root,x<=number[root].key);
  107. }
  108. }
  109. int Select(int R,int x)//返回第x大的元素
  110. {
  111. if(number[R].rlink==0)
  112. {
  113. number[number[R].rlink].size=0;
  114. }
  115. int r=number[number[R].rlink].size+1;
  116. if(x<r)return Select(number[R].rlink,x);
  117. else
  118. {
  119. if(x>r)
  120. {
  121. return Select(number[R].llink,x-r);
  122. }
  123. if(x==r)
  124. {
  125. return number[R].key;
  126. }
  127. }
  128. }
  129. int main()
  130. {
  131. freopen("cashier.in","r",stdin);
  132. freopen("cashier.out","w",stdout);
  133. int N;
  134. char command;
  135. int pay,root=0;
  136. int i;
  137. cin>>N>>lower;
  138. for(i=1;i<=N;i++)
  139. {
  140. cin>>command>>pay;
  141. if(command=='I')
  142. {
  143. if(pay>=lower)
  144. {
  145. Insert(root,pay-add_pay);
  146. }
  147. }
  148. if(command=='F')
  149. {
  150. if(pay>number[root].size)
  151. {
  152. cout<<-1<<endl;
  153. }
  154. else
  155. {
  156. cout<<Select(root,pay)+add_pay<<endl;
  157. }
  158. }
  159. if(command=='A')
  160. {
  161. add_pay+=pay;
  162. }
  163. if(command=='S')
  164. {
  165. add_pay-=pay;
  166. c_num+=Delete(root);
  167. }
  168. }
  169. cout<<c_num<<endl;
  170. return 0;
  171. }