记录编号 146578 评测结果 AAAAAAAAAAA
题目名称 [HAOI 2008]排名系统 最终得分 100
用户昵称 Gravatar乌龙猹 是否通过 通过
代码语言 C++ 运行时间 1.170 s
提交时间 2015-01-18 08:08:30 内存使用 17.75 MiB
显示代码纯文本
#include<cstdio>
#include<cstring>
#define C(i,j,k) c[c[i][j]][k]
using namespace std;
const int N = 250010;
const int P = 999997;
struct data{
    int key,tim,next;char nam[12];
    data(){key=0;tim=1000000;next=0;}
    bool operator < (const data&a) const{
        if(key<a.key) return 1;
        if(key==a.key&&tim>a.tim) return 1;
        return 0;
    }
    bool operator > (const data&a) const{
        if(key>a.key) return 1;
        if(key==a.key&&tim<a.tim) return 1;
        return 0;
    }
    bool operator == (const data&a) const{
        if(key==a.key&&tim==a.tim) return 1;
        return 0;
    }
    bool operator >= (const data&a) const{if(*this>a)return 1;if(*this==a) return 1;return 0;}
    bool operator <= (const data&a) const{if(*this<a)return 1;if(*this==a) return 1;return 0;}
}F[N];
int key[N],siz[N],c[N][2],last[P];
int n,ot,ft,root,total;
char s[20];
inline bool cmp(char *s1,char *s2){
    int l=strlen(s1);
    if(l!=strlen(s2)) return 0;
    for(int i=0;i<l;i++) if(s1[i]!=s2[i]) return 0;
    return 1;
}
inline int Hash(char *s){
    int l=strlen(s);unsigned int hash=0;
    for(int i=0;i<l;i++)
        hash=hash*27+s[i]-'A'+1;
    return hash%P;
}
inline int Get(char *s){
    int hash=Hash(s),now=last[hash];
    while(now!=0){
        if(cmp(s,F[now].nam)==1) return now;
        now=F[now].next;
    }
    return 0;
}
inline void Rot(int &o,bool f){
    int t=c[o][!f];
    c[o][!f]=c[t][f];
    c[t][f]=o;
    siz[t]=siz[o];
    siz[o]=siz[c[o][0]]+siz[c[o][1]]+1;
    o=t;
    return;
}
inline void Maintain(int &o,bool f){
    if(siz[o]<=1) return;
    if(siz[C(o,f,f)] > siz[c[o][!f]]) Rot(o,!f);
    else if(siz[C(o,f,!f)] > siz[c[o][!f]]) Rot(c[o][f],f),Rot(o,!f);
    else return;
    Maintain(c[o][0],0);
    Maintain(c[o][1],1);
    Maintain(o,0);
    Maintain(o,1);
    return;
}
inline void Insert(int &o,int x){
    if(siz[o]==0){
        if(o==0) o=++ot;
        siz[o]=1;key[o]=x;
        return;
    }
    siz[o]++;
    bool f=(F[x]>=F[key[o]]);
    Insert(c[o][f],x);
    Maintain(o,f);
    return;
}
inline void Delete(int &o,int x){
    if(siz[o]==0) return;
    if(F[key[o]]==F[x]){
        if(siz[c[o][0]]==0) {o=c[o][1];return;}
        if(siz[c[o][1]]==0) {o=c[o][0];return;}
        int t=c[o][0];
        while(siz[c[t][1]]) t=c[t][1];
        siz[o]--;
        key[o]=key[t];
        Delete(c[o][0],key[o]);
        return;
    }
    siz[o]--;
    Delete(c[o][(F[x]>=F[key[o]])],x);
    return;
}
inline void Rank(int x){
    int o=root,ran=0;
    while(siz[o]){
        if(F[key[o]]>F[x]) ran+=siz[c[o][1]]+1,o=c[o][0];
        else o=c[o][1];
    }
    printf("%d\n",ran+1);
}
inline void Select(int x){
    int o=root,now;
    while(siz[o]){
        now=siz[c[o][1]]+1;
        if(now==x){
            for(int i=0;i<strlen(F[key[o]].nam);i++)
            printf("%c",F[key[o]].nam[i]);
            return;
        }
        else if(now>x) o=c[o][1];
        else x-=now,o=c[o][0];
    }
    return;
}
inline void Print(int o){
    if(siz[o]==0) return;
    Print(c[o][0]);
    for(int i=0;i<strlen(F[key[o]].nam);i++) printf("%c",F[key[o]].nam[i]);
    printf(" ");
    printf("%d %d\n",F[key[o]].key,F[key[o]].tim);
    Print(c[o][1]);
    return;
}
int main(){
	freopen("rank.in","r",stdin);
	freopen("rank.out","w",stdout);
    scanf("%d",&n);int x,now,pre;char ch;
    for(int i=1;i<=n;i++){
        while(ch=getchar(),ch!='?'&&ch!='+');
        scanf("%s",s);
        if(ch=='+'){
            scanf("%d",&x);
            pre=Get(s);now=Hash(s);
            ft++;F[ft].key=x;F[ft].tim=i;F[ft].next=last[now];
            memcpy(F[ft].nam,s,sizeof(s));
            if(pre==0) Insert(root,ft),total++;
            else Delete(root,pre),Insert(root,ft);
            last[now]=ft;
        }
        else{
            if(s[0]>='0'&&s[0]<='9'){
                x=0;int i;
                for(i=0;i<strlen(s);i++) x=x*10+s[i]-48;
                for(i=x;i<total&&i<x+9;i++) Select(i),printf(" ");
                Select(i);
                printf("\n");
            }
            else{
                now=Get(s);
                Rank(now);
            }
        }
    }
    return 0;
}