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

  1. 20
  2. +ADAM 1000000 加入ADAM的得分记录
  3. +BOB 1000000 加入BOB的得分记录
  4. +TOM 2000000 加入TOM的得分记录
  5. +CATHY 10000000 加入CATHY的得分记录
  6. ?TOM 输出TOM目前排名
  7. ?1 目前有记录的玩家总数为4,因此应输出第1名到第4名。
  8. +DAM 100000 加入DAM的得分记录
  9. +BOB 1200000 更新BOB的得分记录
  10. +ADAM 900000 更新ADAM的得分记录(即使比原来的差)
  11. +FRANK 12340000 加入FRANK的得分记录
  12. +LEO 9000000 加入LEO的得分记录
  13. +KAINE 9000000 加入KAINE的得分记录
  14. +GRACE 8000000 加入GRACE的得分记录
  15. +WALT 9000000 加入WALT的得分记录
  16. +SANDY 8000000 加入SANDY的得分记录
  17. +MICK 9000000 加入MICK的得分记录
  18. +JACK 7320000 加入JACK的得分记录
  19. ?2 目前有记录的玩家总数为12,因此应输出第2名到第11名。
  20. ?5 输出第5名到第13名。
  21. ?KAINE 输出KAINE的排名

Sample Output

  1. 2
  2. CATHY TOM ADAM BOB
  3. CATHY LEO KAINE WALT MICK GRACE SANDY JACK TOM BOB
  4. WALT MICK GRACE SANDY JACK TOM BOB ADAM DAM
  5. 4

Solution

平衡树模板题。。

因为我太懒了字符串哈希直接\(map\)就好了。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define int long long
  4. void read(int &x) {
  5. x=0;int f=1;char ch=getchar();
  6. for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-f;
  7. for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';x*=f;
  8. }
  9. void print(int x) {
  10. if(x<0) putchar('-'),x=-x;
  11. if(!x) return ;print(x/10),putchar(x%10+48);
  12. }
  13. void write(int x) {if(!x) putchar('0');else print(x);putchar('\n');}
  14. const int maxn = 5e5+10;
  15. const int base = 29;
  16. const int inf = 1e18;
  17. char s[20];
  18. int tot=2;
  19. map<string,int > mp;
  20. int hs() {
  21. int r=strlen(s+1);string ss="";
  22. for(int i=1;i<=r;i++) ss+=s[i];
  23. return mp[ss]?mp[ss]:mp[ss]=++tot;
  24. }
  25. char name[maxn][12];
  26. int cnt,fa[maxn],son[maxn][2],sz[maxn],val[maxn],rt,vis[maxn],n;
  27. void update(int x) {sz[x]=sz[son[x][0]]+sz[son[x][1]]+1;}
  28. int which(int x) {return son[fa[x]][1]==x;}
  29. void rotate(int x,int &aim) {
  30. int y=fa[x],z=fa[y],ww=which(x);
  31. if(y==aim) aim=x;
  32. else son[z][son[z][1]==y]=x;
  33. fa[x]=z,fa[y]=x,fa[son[x][ww^1]]=y;
  34. son[y][ww]=son[x][ww^1],son[x][ww^1]=y;
  35. update(y),update(x);
  36. }
  37. void splay(int x,int &aim) {
  38. while(x!=aim) {
  39. int y=fa[x],z=fa[y];
  40. if(y!=aim) rotate(((son[y][1]==x)^(son[z][1]==y))?x:y,aim);
  41. rotate(x,aim);
  42. }
  43. }
  44. void insert(int &p,int x,int f) {
  45. if(!p) {fa[x]=f,sz[x]=1,p=x;splay(x,rt);return ;}
  46. if(val[x]>val[p]) insert(son[p][1],x,p);
  47. else insert(son[p][0],x,p);
  48. }
  49. void del(int x) {
  50. splay(x,rt);int pre=son[x][0],nxt=son[x][1];
  51. while(son[pre][1]) pre=son[pre][1];
  52. while(son[nxt][0]) nxt=son[nxt][0];
  53. splay(pre,rt),splay(nxt,son[rt][1]);
  54. son[nxt][0]=fa[x]=0;update(nxt),update(pre);
  55. }
  56. int get_rk(int x) {splay(x,rt);return sz[son[x][1]];}
  57. void dfs(int x) {
  58. if(son[x][1]) dfs(son[x][1]);
  59. printf("%s ",name[vis[x]]+1);
  60. if(son[x][0]) dfs(son[x][0]);
  61. }
  62. int find(int x,int k) {
  63. if(sz[son[x][0]]>=k) return find(son[x][0],k);
  64. else if(sz[son[x][0]]+1==k) return x;
  65. else return find(son[x][1],k-sz[son[x][0]]-1);
  66. }
  67. void solve(int l,int r) {
  68. splay(find(rt,l-1),rt),splay(find(rt,r+1),son[rt][1]);
  69. dfs(son[son[rt][1]][0]);
  70. }
  71. signed main() {
  72. int m;read(m);
  73. val[1]=-inf;insert(rt,1,0);
  74. val[maxn-1]=inf;insert(rt,maxn-1,0);
  75. for(int cas=1;cas<=m;cas++) {
  76. memset(s,0,sizeof s);
  77. char c=getchar();
  78. while(c=='\n'||c==' ') c=getchar();
  79. if(c=='+') {
  80. scanf("%s",s+1);int x,v,r=strlen(s+1);read(v);s[r+1]=0;
  81. if(vis[x=hs()]) del(x);val[x]=v;insert(rt,x,0);
  82. if(!vis[x]) {vis[x]=++cnt;n++;for(int i=1;i<=r;i++) name[cnt][i]=s[i];}
  83. } else {
  84. c=getchar();int top=0;
  85. while(c!='\n'&&c!=' '&&c!=EOF) s[++top]=c,c=getchar();
  86. if(isdigit(s[1])) {
  87. int x=0;
  88. for(int i=1;i<=top;i++) x=x*10+s[i]-'0';
  89. solve(n-min(n,x+9)+2,n-x+2);puts("");
  90. } else write(get_rk(hs()));
  91. }
  92. }
  93. return 0;
  94. }

[bzoj1056] [HAOI2008]排名系统的更多相关文章

  1. bzoj1056: [HAOI2008]排名系统 && 1862: [Zjoi2006]GameZ游戏排名系统

    hash 加上 平衡树(名次树). 这道题麻烦的地方就在于输入的是一个名字,所以需要hash. 这个hash用的是向后探查避免冲突,如果用类似前向星的方式避免冲突,比较难写,容易挂掉,但也速度快些. ...

  2. 【pb_ds】bzoj1056 [HAOI2008]排名系统/bzoj1862 [Zjoi2006]GameZ游戏排名系统

    STL裸题,线下AC,bzoj无限RE ing…… #include<cstdio> #include<cctype> #include<iostream> #in ...

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

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

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

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

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

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

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

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

  7. 【bzoj1056】排名系统

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

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

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

  9. 2021.12.07 P4291 [HAOI2008]排名系统(Treap)

    2021.12.07 P4291 [HAOI2008]排名系统(Treap) https://www.luogu.com.cn/problem/P4291 双倍经验: https://www.luog ...

随机推荐

  1. js中split()和join()的用法

    Split()方法:把一个字符串分割成字符串数组 如上所示:把字符串a按空格分隔,得3个字符串数组. 在如: var  a=”hao are you”  a.split(“”);  得到[h,a,o, ...

  2. 如何改变memcached默认的缓存时间?

    我们在使用php的memcached的扩展来对memcached进行数据添加时,数据的有效时间有两种方式.如下图. 至于设置一个UNIX时间戳或      以秒为单位的整数(从当前算起的时间差)来说明 ...

  3. ECSHOP和SHOPEX快递单号查询百世快递插件V8.6专版

    发布ECSHOP说明: ECSHOP快递物流单号查询插件特色 本ECSHOP快递物流单号跟踪插件提供国内外近2000家快递物流订单单号查询服务例如申通快递.顺丰快递.圆通快递.EMS快递.汇通快递.宅 ...

  4. js 节点

    var chils= s.childNodes; //得到s的全部子节点 var par=s.parentNode;  //得到s的父节点 var ns=s.nextSbiling;  //获得s的下 ...

  5. Python爬虫基础(一)——HTTP

    前言 因特网联系的是世界各地的计算机(通过电缆),万维网联系的是网上的各种各样资源(通过超文本链接),如静态的HTML文件,动态的软件程序······.由于万维网的存在,处于因特网中的每台计算机可以很 ...

  6. Go web表单

    package main import ( "fmt" "html/template" "log" "net/http" ...

  7. Linq中dbSet 的查询

    1.Find:按照关键字的ID号来查询(速度快) 如: ADShiTi aDShiTi = db.ADShiTis.Find(id); 2.FirstOrDefault:根据部分条件查询,显示最前的一 ...

  8. VI的配置

    vi下设置tab键为4个空格 在每个用户的主目录下,都有一个 vi 的配置文件".vimrc"或".exrc",没有的可以新建一个.用户可以编辑它,使这些设置在 ...

  9. TF-IDF与主题模型 - NLP学习(3-2)

    分词(Tokenization) - NLP学习(1) N-grams模型.停顿词(stopwords)和标准化处理 - NLP学习(2) 文本向量化及词袋模型 - NLP学习(3-1) 在上一篇博文 ...

  10. 主外键多表查询demo

    https://www.cnblogs.com/DragonFire/p/6949767.html mySQL练习-主外键多表查询 MySQL练习-主外键多表查询 练习: 1.建立表关系: 请创建如下 ...