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

Solution

平衡树模板题。。

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

#include<bits/stdc++.h>
using namespace std; #define int long long void read(int &x) {
x=0;int f=1;char ch=getchar();
for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-f;
for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';x*=f;
} void print(int x) {
if(x<0) putchar('-'),x=-x;
if(!x) return ;print(x/10),putchar(x%10+48);
}
void write(int x) {if(!x) putchar('0');else print(x);putchar('\n');} const int maxn = 5e5+10;
const int base = 29;
const int inf = 1e18; char s[20];
int tot=2;
map<string,int > mp; int hs() {
int r=strlen(s+1);string ss="";
for(int i=1;i<=r;i++) ss+=s[i];
return mp[ss]?mp[ss]:mp[ss]=++tot;
} char name[maxn][12];
int cnt,fa[maxn],son[maxn][2],sz[maxn],val[maxn],rt,vis[maxn],n; void update(int x) {sz[x]=sz[son[x][0]]+sz[son[x][1]]+1;} int which(int x) {return son[fa[x]][1]==x;} void rotate(int x,int &aim) {
int y=fa[x],z=fa[y],ww=which(x);
if(y==aim) aim=x;
else son[z][son[z][1]==y]=x;
fa[x]=z,fa[y]=x,fa[son[x][ww^1]]=y;
son[y][ww]=son[x][ww^1],son[x][ww^1]=y;
update(y),update(x);
} void splay(int x,int &aim) {
while(x!=aim) {
int y=fa[x],z=fa[y];
if(y!=aim) rotate(((son[y][1]==x)^(son[z][1]==y))?x:y,aim);
rotate(x,aim);
}
} void insert(int &p,int x,int f) {
if(!p) {fa[x]=f,sz[x]=1,p=x;splay(x,rt);return ;}
if(val[x]>val[p]) insert(son[p][1],x,p);
else insert(son[p][0],x,p);
} void del(int x) {
splay(x,rt);int pre=son[x][0],nxt=son[x][1];
while(son[pre][1]) pre=son[pre][1];
while(son[nxt][0]) nxt=son[nxt][0];
splay(pre,rt),splay(nxt,son[rt][1]);
son[nxt][0]=fa[x]=0;update(nxt),update(pre);
} int get_rk(int x) {splay(x,rt);return sz[son[x][1]];} void dfs(int x) {
if(son[x][1]) dfs(son[x][1]);
printf("%s ",name[vis[x]]+1);
if(son[x][0]) dfs(son[x][0]);
} int find(int x,int k) {
if(sz[son[x][0]]>=k) return find(son[x][0],k);
else if(sz[son[x][0]]+1==k) return x;
else return find(son[x][1],k-sz[son[x][0]]-1);
} void solve(int l,int r) {
splay(find(rt,l-1),rt),splay(find(rt,r+1),son[rt][1]);
dfs(son[son[rt][1]][0]);
} signed main() {
int m;read(m);
val[1]=-inf;insert(rt,1,0);
val[maxn-1]=inf;insert(rt,maxn-1,0);
for(int cas=1;cas<=m;cas++) {
memset(s,0,sizeof s);
char c=getchar();
while(c=='\n'||c==' ') c=getchar();
if(c=='+') {
scanf("%s",s+1);int x,v,r=strlen(s+1);read(v);s[r+1]=0;
if(vis[x=hs()]) del(x);val[x]=v;insert(rt,x,0);
if(!vis[x]) {vis[x]=++cnt;n++;for(int i=1;i<=r;i++) name[cnt][i]=s[i];}
} else {
c=getchar();int top=0;
while(c!='\n'&&c!=' '&&c!=EOF) s[++top]=c,c=getchar();
if(isdigit(s[1])) {
int x=0;
for(int i=1;i<=top;i++) x=x*10+s[i]-'0';
solve(n-min(n,x+9)+2,n-x+2);puts("");
} else write(get_rk(hs()));
}
}
return 0;
}

[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. IDEA开发vue.js卡死问题

    在执行cnpm install后会在node_modules这个文件下面生成vue的相关依赖文件, 这个时候当执行cnpm run dev命令时,会导致IDEA出现卡死的问题,解决方法如下:

  2. 处理laravel表单提交默认将空值转为null的问题

    比如表单提交,如果我们提交了这个字段,但是这个字段为空字符串.在Laravel中会自动转义成Null. 处理这个问题,直到找到中间件\vendor\laravel\framework\src\Illu ...

  3. php 电商系统SKU库存设计

    sku 全称为:Stock Keeping Unit,是库存进出计量的基本单元. 我们一般会在电商网站基本都会看到 比如淘宝,JD 淘宝和JD的 方式可能不一样,因为我不清楚他们具体是如何设计的, J ...

  4. 2.1 进程控制之fork创建子进程

    fork()函数 目标:熟悉fork创建一个和多个子进程子线程 函数原型:pid_t fork(void); 返回值:成功返回:① 父进程返回子进程的ID(非负) ②子进程返回 0 : 失败返回-1. ...

  5. ssh 远程命令

    远程拷贝文件,scp -r 的常用方法: 1.使用该命令的前提条件要求目标主机已经成功安装openssh-server 如没有安装使用 sudo apt-get install openssh-ser ...

  6. vue---day04

    1. Node.js 1.1 介绍: - Node.js 是一个JavaScript运行环境,实质上是对Chrome V8引擎的封装. - Node.js 不是一个 JavaScript 框架,不同于 ...

  7. JAVA判断时间是否在时间区间内

    package com.liying.tiger.test; import java.text.ParseException; import java.text.SimpleDateFormat; i ...

  8. Python自动化运维——文件内容差异对比

    Infi-chu: http://www.cnblogs.com/Infi-chu/ 模块:difflib 安装:Python版本大于等于2.3系统自带 功能:对比文本之间的差异,而且支持输出可读性比 ...

  9. dotnet core 数据库

    dotnet core 数据库 程序开发过程中,需要使用数据对数据进行存储,分析等.通常而言都会使用ORM来实现关系数据库与实体对象的转化,过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持 ...

  10. Android ANR 分析

    首先贴一下trace 文件 Process: com.oppo.reader PID: 20358 Time: 2933175644_1545041895232 Flags: 0x38d83e44 P ...