比赛 20120720 评测结果 AWWWTTTTTT
题目名称 忠诚点数榜 最终得分 10
用户昵称 Truth.Cirno 运行时间 1.350 s
代码语言 C++ 内存使用 6.01 MiB
提交时间 2012-07-20 11:51:35
显示代码纯文本
#include <cstdio>
#include <cstring>
using namespace std;

struct strings
{
	char s[12];
}name[250001];

int ntoa[250001],aton[250001],a[250001];

int main(void)
{
	freopen("lp.in","r",stdin);
	freopen("lp.out","w",stdout);
	int i,j,k,pos,len,num,c,n,sco,namenum=0,atont;
	char ch;
	bool found;
	strings str;
	scanf("%d\n",&n);
	for (i=0;i<n;i++)
	{
		scanf("%c%s",&ch,&str.s);
		if (ch=='+')
		{
			scanf("%d\n",&sco);
			found=false;
			for (j=1;j<=namenum;j++)
				if (strcmp(str.s,name[j].s)==0)
				{
					found=true;
					a[ntoa[j]]=sco;
					num=a[ntoa[j]];
					atont=aton[ntoa[j]];
					for (k=ntoa[j]-1;k>=1;k--)
					{
						if (num<=a[k])
							break;
					}
					pos=k+1;
					for (k=ntoa[j];k>pos;k--)
					{
						a[k]=a[k-1];
						aton[k]=aton[k-1];
						ntoa[aton[k]]++;
					}
					a[pos]=num;
					aton[pos]=atont;
					ntoa[j]=pos;
					break;
				}
			if (!found)
			{
				namenum++;
				name[namenum]=str;
				ntoa[namenum]=namenum;
				aton[namenum]=namenum;
				a[namenum]=sco;
				num=a[namenum];
				atont=aton[namenum];
				for (k=namenum-1;k>=1;k--)
				{
					if (num<=a[k])
						break;
				}
				pos=k+1;
				for (k=namenum;k>pos;k--)
				{
					a[k]=a[k-1];
					aton[k]=aton[k-1];
					ntoa[aton[k]]++;
				}
				a[pos]=num;
				aton[pos]=atont;
				ntoa[namenum]=pos;
			}
		}
		else if (ch=='?')
		{
			scanf("\n");
			if (str.s[0]>='0'&&str.s[0]<='9')
			{
				len=strlen(str.s);
				num=0;
				for (j=0;j<len;j++)
					num=num*10+str.s[j]-'0';
				printf("%s",name[aton[num]].s);
				for (j=num+1,c=2;j<=namenum&&c<=10;j++,c++)
				{
					printf(" %s",name[aton[j]].s);
				}
				printf("\n");
			}
			else
			{
				for (j=1;j<=namenum;j++)
					if (strcmp(name[j].s,str.s)==0)
					{
						printf("%d\n",ntoa[j]);
						break;
					}
			}
		}
	}
	return(0);
}