记录编号 |
283669 |
评测结果 |
AAAAAAAAAAE |
题目名称 |
[HAOI 2008]排名系统 |
最终得分 |
90 |
用户昵称 |
FoolMike |
是否通过 |
未通过 |
代码语言 |
C++ |
运行时间 |
1.174 s |
提交时间 |
2016-07-15 10:25:59 |
内存使用 |
7.94 MiB |
显示代码纯文本
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- using namespace std;
- const int N=250010;
- struct Key{
- char name[10];
- int k,num;
- bool operator > (const Key &x)const{return k==x.k?num>x.num:k<x.k;}
- bool operator == (const Key &x)const{return num==x.num;}
- }now;
- struct node{
- node *go[26];
- int k,num;
- node(){memset(go,0,sizeof go);k=num=0;}
- }*root=new node(),*p;
- void trie(){
- p=root;int len=strlen(now.name);
- for (int i=0;i<len;i++){
- int j=now.name[i]-'A';
- if (!p->go[j]) p->go[j]=new node();
- p=p->go[j];
- }
- swap(now.k,p->k);swap(now.num,p->num);
- }
- struct SBT{
- Key k[N];
- int l[N],r[N],s[N],x,top;
- void update(int x){
- s[x]=s[l[x]]+s[r[x]]+1;
- }
- void l_rotate(int &x){
- int y=r[x];
- r[x]=l[y];l[y]=x;
- update(x);update(y);
- x=y;
- }
- void r_rotate(int &x){
- int y=l[x];
- l[x]=r[y];r[y]=x;
- update(x);update(y);
- x=y;
- }
- void Maintain(int &x,bool y){
- if (!y){
- if (s[l[l[x]]]>s[r[x]]) r_rotate(x);else
- if (s[r[l[x]]]>s[r[x]]){
- l_rotate(l[x]);r_rotate(x);
- }else return;
- }
- else{
- if (s[r[r[x]]]>s[l[x]]) l_rotate(x);else
- if (s[l[r[x]]]>s[l[x]]){
- r_rotate(r[x]);l_rotate(x);
- }else return;
- }
- Maintain(l[x],0);Maintain(r[x],1);
- Maintain(x,1);Maintain(x,0);
- }
- void insert(int &x){
- if (x==0){
- x=++top;s[x]=1;k[x]=now;return;
- }
- s[x]++;
- insert(now>k[x]?r[x]:l[x]);
- Maintain(x,now>k[x]);
- }
- int rank(int x){
- int i=s[l[x]]+1;
- if (k[x]==now) return i;
- if (k[x]>now) return rank(l[x]);
- else return i+rank(r[x]);
- }
- int select(int x,int rank){
- int i=s[l[x]]+1;
- if (i==rank) return x;
- if (i>rank) return select(l[x],rank);
- else return select(r[x],rank-i);
- }
- void remove(int &x){
- s[x]--;
- if (k[x]==now){
- if (!l[x]||!r[x]){
- x=l[x]+r[x];return;
- }
- int y=select(r[x],1);
- swap(k[x],k[y]);
- remove(r[x]);
- return;
- }
- remove(now>k[x]?r[x]:l[x]);
- }
- /*int pred(Key &key){
- int i=rank(x,key);
- if (i==1) return -1;
- return select(x,i-1);
- }
- int succ(Key &key){
- int i=rank(x,key);
- if (i==s[x]) return -1;
- return select(x,i+1);
- }*/
- }T;
- int n,score,rank,num,_x,pos;char ch,c;
- int read(){
- int len=strlen(now.name);_x=0;
- for (int i=0;i<len;i++) _x=_x*10+now.name[i]-'0';
- return _x;
- }
- int main()
- {
- freopen("rank.in","r",stdin);
- freopen("rank.out","w",stdout);
- scanf("%d",&n);
- for (int i=1;i<=n;i++){
- for (ch=getchar();ch!='+'&&ch!='?';ch=getchar());
- scanf("%s",now.name);
- if (ch=='+'){
- scanf("%d\n",&score);
- now.num=i;now.k=score;
- trie();
- if (now.num) T.remove(T.x);
- now.num=i;now.k=score;
- T.insert(T.x);
- }
- else{
- if (now.name[0]>='A'&&now.name[0]<='Z'){
- trie();
- num=now.num;score=now.k;
- trie();
- now.num=num;now.k=score;
- printf("%d\n",T.rank(T.x));
- }
- else{
- rank=read();
- for (int i=1;i<=10;i++){
- if (rank>T.s[T.x]) break;
- now=T.k[T.select(T.x,rank)];
- printf("%s ",now.name);
- rank++;
- }
- putchar('\n');
- }
- }
- }
- return 0;
- }