Description

排名系统通常要应付三种请求:上传一条新的得分记录、查询某个玩家的当前排名以及返回某个区段内的排名记录。当某个玩家上传自己最新的得分记录时,他原有的得分记录会被删除。为了减轻服务器负担,在返回某个区段内的排名记录时,最多返回10条记录。
Input

第一行是一个整数n(n>=10)表示请求总数目。接下来n行,每行包含了一个请求。请求的具体格式如下: +Name Score 上传最新得分记录。Name表示玩家名字,由大写英文字母组成,不超过10个字符。Score为最多8位的正整数。 ?Name 查询玩家排名。该玩家的得分记录必定已经在前面上传。 ?Index 返回自第Index名开始的最多10名玩家名字。Index必定合法,即不小于1,也不大于当前有记录的玩家总数。
Output

对于?Name格式的请求,应输出一个整数表示该玩家当前的排名。对于?Index格式的请求,应在一行中依次输出从第Index名开始的最多10名玩家姓名,用一个空格分隔。
Sample Input
20
+ADAM 1000000 加入ADAM的得分记录
+BOB 1000000 加入BOB的得分记录
+TOM 2000000 加入TOM的得分记录
+CATHY 10000000 加入CATHY的得分记录
?TOM 输出TOM目前排名
?1 目前有记录的玩家总数为4,因此应输出第1名到第4名。
+DAM 100000 加入DAM的得分记录
+BOB 1200000 更新BOB的得分记录
+ADAM 900000 更新ADAM的得分记录(即使比原来的差)
+FRANK 12340000 加入FRANK的得分记录
+LEO 9000000 加入LEO的得分记录
+KAINE 9000000 加入KAINE的得分记录
+GRACE 8000000 加入GRACE的得分记录
+WALT 9000000 加入WALT的得分记录
+SANDY 8000000 加入SANDY的得分记录
+MICK 9000000 加入MICK的得分记录
+JACK 7320000 加入JACK的得分记录
?2 目前有记录的玩家总数为12,因此应输出第2名到第11名。
?5 输出第5名到第13名。
?KAINE 输出KAINE的排名
Sample Output
2
CATHY TOM ADAM BOB
CATHY LEO KAINE WALT MICK GRACE SANDY JACK TOM BOB
WALT MICK GRACE SANDY JACK TOM BOB ADAM DAM
4

HINT

20%数据满足N<=100 100%数据满足N<=250000

唉,splay真的不是很熟练啊

又调了一上午,不过还是有一点收获的,每次发现超时都是因为找答案的方法不够好(当你要l到r的答案时,1.把l到r全部旋到一起 2.把l旋到根然后往右边遍历)

 const
     maxn=;
 type
     node=record
       son:..]of longint;
       size,fa,f,t:longint;
       str:string;
     end;
 var
     tree:..maxn*]of node;
     hash,next:..maxn*]of longint;
     n,tot,time,root,k,num:longint;

 function hashx(s:string):longint;
 var
     i:longint;
 begin
     hashx:=;
      to length(s) do
       hashx:=(hashx*+ord(s[i])-ord('A'))mod maxn;
     inc(hashx);
 end;

 function get(s:string):longint;
 begin
     get:=hashx(s);
     ) do
       get:=next[get];
 end;

 procedure rotate(x,w:longint);
 var
     y:longint;
 begin
     y:=tree[x].fa;
     tree[y].son[w]:=tree[x].son[w xor ];
     ]<> ]].fa:=y;
     tree[x].son[w xor ]:=y;
     if root=y then root:=x
     else
       ]=y ]:=x
       ]:=x;
     tree[x].fa:=tree[y].fa;
     tree[y].fa:=x;
     with tree[y] do
       size:=tree[son[]].size++tree[son[]].size;
 end;

 procedure splay(x,z:longint);
 var
     y:longint;
 begin
     while tree[x].fa<>z do
       begin
         y:=tree[x].fa;
         if tree[y].fa=z then
           ]=x )
           )
         else
           ]=y then
             ]=x then
               begin
                 rotate(y,);
                 rotate(x,);
               end
             else
               begin
                 rotate(x,);
                 rotate(x,);
               end
           else
             ]=x then
               begin
                 rotate(x,);
                 rotate(x,);
               end
             else
               begin
                 rotate(y,);
                 rotate(x,);
               end;
       end;
     with tree[x] do
       size:=tree[son[]].size++tree[son[]].size;
 end;

 procedure delete(x:longint);
 var
     l,r:longint;
 begin
     splay(x,);
     l:=tree[x].son[];
     r:=tree[x].son[];
     ) ) then
       begin
         root:=l+r;
         tree[l+r].fa:=;
         tree[x].son[]:=;
         tree[x].son[]:=;
       end
     else
       begin
         ]<> do
           l:=tree[l].son[];
         ]<> do
           r:=tree[r].son[];
         splay(l,);
         splay(r,l);
         tree[r].son[]:=;
         dec(tree[r].size);
         dec(tree[l].size);
         tree[x].fa:=;
       end;
 end;

 procedure add(x:longint);
 var
     now:longint;
 begin
      then
       begin
         root:=x;
         tree[x].fa:=;
         tree[x].size:=;
       end
     else
       begin
         now:=root;
         while true do
           begin
             inc(tree[now].size);
             if (tree[x].f>tree[now].f) or ((tree[x].f=tree[now].f) and (tree[x].t<tree[now].t)) then
               ]= then break
               ]
             else
               ]= then break
               ];
           end;
         ]:=x
         ]:=x;
         tree[x].size:=;
         tree[x].fa:=now;
       end;
 splay(x,);
 end;

 procedure insert(s:string;x:longint);
 var
     z:longint;
 begin
     z:=get(s);
      then
       begin
         delete(z);
         tree[z].t:=time;
         tree[z].f:=x;
         add(z);
       end
     else
       begin
         z:=hashx(s);
         inc(num);
         if tree[z].str='' then
           begin
             tree[z].str:=s;
             tree[z].t:=time;
             tree[z].f:=x;
             add(z);
           end
         else
           begin
              do
               z:=next[z];
             inc(tot);
             next[z]:=tot;
             tree[tot].str:=s;
             tree[tot].t:=time;
             tree[tot].f:=x;
             add(tot);
           end;
       end;
 end;

 function find(x:longint):longint;
 var
     now:longint;
 begin
     now:=root;
     while true do
       begin
         ]].size ]
         else
           ]].size+ then exit(now)
           else
             begin
               dec(x,tree[tree[now].son[]].size+);
               now:=tree[now].son[];
             end;
       end;
 end;

 procedure dfs(now:longint);
 begin
      then exit;
     ]<> ]);
      then exit;
     inc(k);
     write(' ',tree[now].str);
      then exit;
     ]<> ]);
 end;

 function min(x,y:longint):longint;
 begin
     if x<y then exit(x);
     exit(y);
 end;

 procedure main;
 var
     x:longint;
     c:char;
     s:string;
 begin
     readln(n);
     tot:=maxn;
      to n do
       begin
         read(c);
         if c='+' then
           begin
             read(c);
             s:='';
             while c<>' ' do
               begin
                 s:=s+c;
                 read(c);
               end;
             readln(x);
             insert(s,x);
           end
         else
           if c='?' then
           begin
             readln(s);
             ])>=ord(])<=ord('Z')) then
               begin
                 splay(get(s),);
                 writeln(tree[tree[root].son[]].size+);
               end
             else
               begin
                 val(s,x);
                 splay(find(x),);
                 write(tree[root].str);
                 )),root);
                 k:=;
                 ]<> ]);
                 writeln;
               end;
           end;
       end;
 end;

 begin
     main;
 end.

1056: [HAOI2008]排名系统 - BZOJ的更多相关文章

  1. bzoj 1056 [HAOI2008]排名系统(1862 [Zjoi2006]GameZ游戏排名系统)

    1056: [HAOI2008]排名系统 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1854  Solved: 502[Submit][Statu ...

  2. 【BZOJ】1862: [Zjoi2006]GameZ游戏排名系统 &amp; 1056: [HAOI2008]排名系统(treap+非常小心)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1862 http://www.lydsy.com/JudgeOnline/problem.php?id ...

  3. bzoj 1862/1056 [HAOI2008]排名系统

    原题链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1862 很恶心的 一道题,我也不晓得自己是第几次写这题了%>_<%. 写了两种方 ...

  4. [BZOJ 1056][HAOI2008]排名系统

    传送门 \(\color{green}{solution}\) \(fhq \_treap\)模板题. 对于 \(+\) 操作,如果当前人不存在,那么直接加入;如果存在,那么先将他删除,再加入.复杂度 ...

  5. bzoj 1862: [Zjoi2006]GameZ游戏排名系统 &amp; bzoj 1056: [HAOI2008]排名系统

    傻叉了一晚上,把t打成x,然后这题神奇在于输出一段数,不足的不用输出,一开始我的是直接找没有后面就退,然后这样会格式错误囧……然后最后zj的还卡了下空间,于是不用string就过了……string毁一 ...

  6. [HAOI2008]排名系统&amp; [Zjoi2006]GameZ游戏排名系统

    1056: [HAOI2008]排名系统 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2487  Solved: 711[Submit][Statu ...

  7. 【BZOJ1056】[HAOI2008]排名系统(Splay)

    [BZOJ1056][HAOI2008]排名系统(Splay) 题面 BZOJ 洛谷 题解 \(Splay\)随便维护一下就好了,至于名字什么的,我懒得手写哈希表了,直接哈希之后拿\(map\)压. ...

  8. 数据结构(Splay平衡树):HAOI2008 排名系统

    [HAOI2008] 排名系统 [题目描述] 排名系统通常要应付三种请求:上传一条新的得分记录.查询某个玩家的当前排名以及返回某个区段内的排名记录.当某个玩家上传自己最新的得分记录时,他原有的得分记录 ...

  9. BZOJ_1862_[Zjoi2006]GameZ游戏排名系统&amp;&amp;BZOJ_1056_[HAOI2008]排名系统_Splay

    BZOJ_1862_[Zjoi2006]GameZ游戏排名系统&&BZOJ_1056_[HAOI2008]排名系统_Splay Description 排名系统通常要应付三种请求:上传 ...

随机推荐

  1. jquery基础知识汇总

    jquery基础知识汇总 一.简介 定义 jQuery创始人是美国John Resig,是优秀的Javascript框架: jQuery是一个轻量级.快速简洁的javaScript库.源码戳这 jQu ...

  2. am,pm时间转换

    写在前面 最近遇到的一个问题,在英文操作系统上,获取到的时间是带am或者pm的.但是数据库是datetime类型,存储的时候竟然都变成0000-00-00 00:00:00.但是在中文操作系统上又是正 ...

  3. android imageButton 点击按钮前中后,按钮颜色的变化

    我们在开发的过程中,往往为了美化界面的需要,会修改按钮的默认外观,而因为Android中的按钮有三种状态—默认,被点击,被选中.所以,如果要改变按钮的外观,需要对这三种情况都做出修改,也许在以往,我们 ...

  4. NHibernate 二级缓冲

    session.CreateCriteria(typeof(SysModuleFields)).SetCacheable(true).List<SysModuleFields>(); se ...

  5. poj 2104 K-th Number(主席树)

    Description You are working for Macrohard company in data structures department. After failing your ...

  6. Java设计模式05:常用设计模式之原型模式(创建型模式)

    1. Java之原型模式(Prototype Pattern)     原型模式属于对象的创建模式.通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象. ...

  7. 最长公共子序列python实现

    最长公共子序列是动态规划基本题目,以下依照动态规划基本步骤解出来. 1.找出最优解的性质,并刻划其结构特征 序列a共同拥有m个元素,序列b共同拥有n个元素,假设a[m-1]==b[n-1],那么a[: ...

  8. shell 并发多进程同时执行

    #!/bin/bash SEND_THREAD_NUM= #设置进程数. tmp_fifofile="/tmp/$$.fifo" # 脚本运行的当前进程ID号作为文件名 mkfif ...

  9. javaweb学习总结(六)——Servlet开发(二)(转)

    转载自 http://www.cnblogs.com/xdp-gacl/p/3763559.html 一.ServletConfig讲解 1.1.配置Servlet初始化参数 在Servlet的配置文 ...

  10. 领域驱动设计学习之路—DDD的原则与实践

    本文是我学习Scott Millett & Nick Tune编著的<领域驱动设计模式.原理与实践>一书的学习笔记,一共会分为4个部分如下,此文为第1部分: ① 领域驱动设计的原则 ...