记录编号 192397 评测结果 AAAAAAAAAA
题目名称 197.[HAOI 2008]排名系统 最终得分 100
用户昵称 yyy 是否通过 通过
代码语言 C++ 运行时间 0.676 s
提交时间 2015-10-10 20:31:54 内存使用 18.38 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#define mod 985003
using namespace std;
int n,root,sz,tot,head[mod+1];
struct data1{int v,time,next;char ch[10];}hash[250001];
struct data2{int l,r,v,s,rnd,time;char ch[10];}tr[250001];
void update(int k){tr[k].s=tr[tr[k].l].s+tr[tr[k].r].s+1;}
void rturn(int &k){int t=tr[k].l;tr[k].l=tr[t].r;tr[t].r=k;tr[t].s=tr[k].s;update(k);k=t;}
void lturn(int &k){int t=tr[k].r;tr[k].r=tr[t].l;tr[t].l=k;tr[t].s=tr[k].s;update(k);k=t;}
bool cmp(char a[],char b[])
{for(int i=1;i<max(strlen(a),strlen(b));i++)if(a[i]!=b[i])return 0;return 1;}
int Hash(char ch[])
{
	int s=0; 
	for(int i=1;i<strlen(ch);i++)
    {s*=27;s+=(ch[i]-'A'+1);s%=mod;}
    return s;
}
void del(int &k,int x,int time)
{
     if(tr[k].v==x)
     {
          if(tr[k].time==time)
          {
               if(tr[k].l*tr[k].r==0)k=tr[k].l+tr[k].r;
               else if(tr[tr[k].l].rnd<tr[tr[k].r].rnd){rturn(k);del(k,x,time);}
               else {lturn(k);del(k,x,time);}
          }
          else if(time>tr[k].time){tr[k].s--;del(tr[k].l,x,time);}
          else {tr[k].s--;del(tr[k].r,x,time);}
     }
     else if(x<tr[k].v){tr[k].s--;del(tr[k].l,x,time);}
     else {tr[k].s--;del(tr[k].r,x,time);}
 }
void insert(int &k,char ch[],int x,int time)
{
     if(k==0)
	 {
	      sz++;k=sz;tr[k].v=x;tr[k].s=1;tr[k].rnd=rand();
		  memcpy(tr[k].ch,ch,strlen(ch));tr[k].time=time;
	      return;
	 }
	 tr[k].s++;
     if(x<=tr[k].v){insert(tr[k].l,ch,x,time);if(tr[tr[k].l].rnd<tr[k].rnd)rturn(k);}
     else{insert(tr[k].r,ch,x,time);if(tr[tr[k].r].rnd<tr[k].rnd)lturn(k);}
 }
void INS(char ch[],int x,int time)
{
    int k=Hash(ch);int i=head[k];
    while(i)
    {
    	if(cmp(hash[i].ch,ch))
		{
		   del(root,hash[i].v,hash[i].time);
		   hash[i].time=time;hash[i].v=x;
		   insert(root,ch,x,time);
		   return;
	    }
	    i=hash[i].next;
    }
    tot++;
    hash[tot].time=time;hash[tot].v=x;
    memcpy(hash[tot].ch,ch,strlen(ch));
    hash[tot].next=head[k];head[k]=tot;
    insert(root,ch,x,time);
}
int get(char ch[])
{
	int k=Hash(ch);int i=head[k];
	while(i)
	{
        if(cmp(hash[i].ch,ch))return i;
		i=hash[i].next;
	}
}
int getrank(int k,int x,int time)
{
    if(k==0)return 0;
    if(tr[k].v==x)
    {
        if(tr[k].time>time)return getrank(tr[k].r,x,time);
        else if(tr[k].time<time)return 1+tr[tr[k].r].s+getrank(tr[k].l,x,time);
        else return tr[tr[k].r].s+1;
    }
    else if(tr[k].v<x)return getrank(tr[k].r,x,time);
    else return 1+tr[tr[k].r].s+getrank(tr[k].l,x,time);
}
void ask1(char ch[])
{
    int t=get(ch);
    printf("%d\n",getrank(root,hash[t].v,hash[t].time));
}
int index(int k,int x)
{
     if(tr[tr[k].r].s+1==x)return k;
     else if(x<=tr[tr[k].r].s)return index(tr[k].r,x);
     else return index(tr[k].l,x-tr[tr[k].r].s-1);
 }
void ask2(char ch[])
{
    int s=0;
    for(int i=1;i<strlen(ch);i++){s*=10;s+=ch[i]-'0';}
    for(int i=s;i<=tot&&i<=s+9;i++)
    {
       printf("%s",tr[index(root,i)].ch+1);
       if(i<tot&&i<s+9)printf(" ");
       }
    printf("\n");
}
int main()
{	
	freopen("rank.in","r",stdin);
	//freopen("ex_r.out","w",stdout);
	freopen("rank.out","w",stdout);
	scanf("%d",&n);char ch[11];int x;
	for(int i=1;i<=n;i++)
	{
            scanf("%s",ch);
            {
                if(ch[0]=='+'){scanf("%d",&x);INS(ch,x,i);}
                else if(ch[1]>='A'&&ch[1]<='Z')ask1(ch);
                else ask2(ch);
            }
	}
	return 0;
}