记录编号 283669 评测结果 AAAAAAAAAAE
题目名称 [HAOI 2008]排名系统 最终得分 90
用户昵称 GravatarFoolMike 是否通过 未通过
代码语言 C++ 运行时间 1.174 s
提交时间 2016-07-15 10:25:59 内存使用 7.94 MiB
显示代码纯文本
  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. using namespace std;
  5. const int N=250010;
  6. struct Key{
  7. char name[10];
  8. int k,num;
  9. bool operator > (const Key &x)const{return k==x.k?num>x.num:k<x.k;}
  10. bool operator == (const Key &x)const{return num==x.num;}
  11. }now;
  12. struct node{
  13. node *go[26];
  14. int k,num;
  15. node(){memset(go,0,sizeof go);k=num=0;}
  16. }*root=new node(),*p;
  17. void trie(){
  18. p=root;int len=strlen(now.name);
  19. for (int i=0;i<len;i++){
  20. int j=now.name[i]-'A';
  21. if (!p->go[j]) p->go[j]=new node();
  22. p=p->go[j];
  23. }
  24. swap(now.k,p->k);swap(now.num,p->num);
  25. }
  26. struct SBT{
  27. Key k[N];
  28. int l[N],r[N],s[N],x,top;
  29. void update(int x){
  30. s[x]=s[l[x]]+s[r[x]]+1;
  31. }
  32. void l_rotate(int &x){
  33. int y=r[x];
  34. r[x]=l[y];l[y]=x;
  35. update(x);update(y);
  36. x=y;
  37. }
  38. void r_rotate(int &x){
  39. int y=l[x];
  40. l[x]=r[y];r[y]=x;
  41. update(x);update(y);
  42. x=y;
  43. }
  44. void Maintain(int &x,bool y){
  45. if (!y){
  46. if (s[l[l[x]]]>s[r[x]]) r_rotate(x);else
  47. if (s[r[l[x]]]>s[r[x]]){
  48. l_rotate(l[x]);r_rotate(x);
  49. }else return;
  50. }
  51. else{
  52. if (s[r[r[x]]]>s[l[x]]) l_rotate(x);else
  53. if (s[l[r[x]]]>s[l[x]]){
  54. r_rotate(r[x]);l_rotate(x);
  55. }else return;
  56. }
  57. Maintain(l[x],0);Maintain(r[x],1);
  58. Maintain(x,1);Maintain(x,0);
  59. }
  60. void insert(int &x){
  61. if (x==0){
  62. x=++top;s[x]=1;k[x]=now;return;
  63. }
  64. s[x]++;
  65. insert(now>k[x]?r[x]:l[x]);
  66. Maintain(x,now>k[x]);
  67. }
  68. int rank(int x){
  69. int i=s[l[x]]+1;
  70. if (k[x]==now) return i;
  71. if (k[x]>now) return rank(l[x]);
  72. else return i+rank(r[x]);
  73. }
  74. int select(int x,int rank){
  75. int i=s[l[x]]+1;
  76. if (i==rank) return x;
  77. if (i>rank) return select(l[x],rank);
  78. else return select(r[x],rank-i);
  79. }
  80. void remove(int &x){
  81. s[x]--;
  82. if (k[x]==now){
  83. if (!l[x]||!r[x]){
  84. x=l[x]+r[x];return;
  85. }
  86. int y=select(r[x],1);
  87. swap(k[x],k[y]);
  88. remove(r[x]);
  89. return;
  90. }
  91. remove(now>k[x]?r[x]:l[x]);
  92. }
  93. /*int pred(Key &key){
  94. int i=rank(x,key);
  95. if (i==1) return -1;
  96. return select(x,i-1);
  97. }
  98. int succ(Key &key){
  99. int i=rank(x,key);
  100. if (i==s[x]) return -1;
  101. return select(x,i+1);
  102. }*/
  103. }T;
  104. int n,score,rank,num,_x,pos;char ch,c;
  105. int read(){
  106. int len=strlen(now.name);_x=0;
  107. for (int i=0;i<len;i++) _x=_x*10+now.name[i]-'0';
  108. return _x;
  109. }
  110. int main()
  111. {
  112. freopen("rank.in","r",stdin);
  113. freopen("rank.out","w",stdout);
  114. scanf("%d",&n);
  115. for (int i=1;i<=n;i++){
  116. for (ch=getchar();ch!='+'&&ch!='?';ch=getchar());
  117. scanf("%s",now.name);
  118. if (ch=='+'){
  119. scanf("%d\n",&score);
  120. now.num=i;now.k=score;
  121. trie();
  122. if (now.num) T.remove(T.x);
  123. now.num=i;now.k=score;
  124. T.insert(T.x);
  125. }
  126. else{
  127. if (now.name[0]>='A'&&now.name[0]<='Z'){
  128. trie();
  129. num=now.num;score=now.k;
  130. trie();
  131. now.num=num;now.k=score;
  132. printf("%d\n",T.rank(T.x));
  133. }
  134. else{
  135. rank=read();
  136. for (int i=1;i<=10;i++){
  137. if (rank>T.s[T.x]) break;
  138. now=T.k[T.select(T.x,rank)];
  139. printf("%s ",now.name);
  140. rank++;
  141. }
  142. putchar('\n');
  143. }
  144. }
  145. }
  146. return 0;
  147. }