【bzoj1056】排名系统
1056: [HAOI2008]排名系统
Time Limit: 10 Sec Memory Limit: 162 MB
Submit: 2195 Solved: 623
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
+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
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
N<=250000
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<ctime>
#include<algorithm>
using namespace std;
const int INF=;
int n,root,tot,len,head[INF+];
struct node1{int v,next,time;char ch[];}hash[];
struct node2{int v,time,fix,size,l,r; char ch[];}tr[];
void updata(int p) {tr[p].size=tr[tr[p].l].size+tr[tr[p].r].size+;}
void lturn(int &p) {int c=tr[p].r; tr[p].r=tr[c].l; tr[c].l=p; tr[c].size=tr[p].size; updata(p); p=c;}
void rturn(int &p) {int c=tr[p].l; tr[p].l=tr[c].r; tr[c].r=p; tr[c].size=tr[p].size; updata(p); p=c;}
bool cmp(char a[],char b[]) {for(int i=;i<max(strlen(a),strlen(b));i++) if(a[i]!=b[i]) return ;return ;}
int Hash(char ch[]) {int s=; for(int i=;i<strlen(ch);i++) {s*=; s+=ch[i]-'A'+; s%=INF;} return s;}
void insert(int &p,int v,int time,char ch[])
{
if(!p)
{
p=++len; tr[p].size=; tr[p].v=v; tr[p].time=time; tr[p].fix=rand();
memcpy(tr[p].ch,ch,strlen(ch)); return;
}
tr[p].size++;
if(v<=tr[p].v) {insert(tr[p].l,v,time,ch); if(tr[p].fix>tr[tr[p].l].fix) rturn(p);}
else {insert(tr[p].r,v,time,ch); if(tr[p].fix>tr[tr[p].r].fix) lturn(p);}
}
void del(int &p,int v,int time)
{
if(v==tr[p].v)
{
if(time==tr[p].time)
{
if(tr[p].l*tr[p].r==) p=tr[p].l+tr[p].r;
else if(tr[tr[p].l].fix<tr[tr[p].r].fix) {rturn(p); del(p,v,time);}
else {lturn(p); del(p,v,time);}
}
else if(time>tr[p].time) {tr[p].size--; del(tr[p].l,v,time);}
else {tr[p].size--; del(tr[p].r,v,time);}
}
else if(v<tr[p].v) {tr[p].size--; del(tr[p].l,v,time);}
else {tr[p].size--; del(tr[p].r,v,time);}
}
void work(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,x,time,ch);
return;
}
i=hash[i].next;
}
tot++;
hash[tot].time=time; hash[tot].v=x;
hash[tot].next=head[k]; head[k]=tot;
memcpy(hash[tot].ch,ch,strlen(ch));
insert(root,x,time,ch);
}
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 rank(int p,int v,int time)
{
if(p==) return ;
if(tr[p].v==v)
{
if(tr[p].time==time) return tr[tr[p].r].size+;
else if(time<tr[p].time) return rank(tr[p].r,v,time);
else return tr[tr[p].r].size++rank(tr[p].l,v,time);
}
else if(v>tr[p].v) return rank(tr[p].r,v,time);
else return tr[tr[p].r].size++rank(tr[p].l,v,time);
}
void ask1(char ch[])
{
int t=get(ch);
printf("%d\n",rank(root,hash[t].v,hash[t].time));
}
int index(int k,int x)
{
if(tr[tr[k].r].size+==x)return k;
else if(x<=tr[tr[k].r].size)return index(tr[k].r,x);
else return index(tr[k].l,x-tr[tr[k].r].size-);
}
void ask2(char ch[])
{
int s=;
for(int i=;i<strlen(ch);i++){s*=;s+=ch[i]-'';}
for(int i=s;i<=tot&&i<=s+;i++)
{
printf("%s",tr[index(root,i)].ch+);
if(i<tot&&i<s+)printf(" ");
}
printf("\n");
}
int main()
{
freopen("cin.in","r",stdin);
freopen("cout.out","w",stdout);
scanf("%d",&n); char ch[]; int x;
for(int i=;i<=n;i++)
{
scanf("%s",ch);
if(ch[]=='+') {scanf("%d",&x); work(ch,x,i);}
else if(ch[]>='A'&&ch[]<='Z') ask1(ch);
else ask2(ch);
}
return ;
}
【bzoj1056】排名系统的更多相关文章
- [BZOJ1056][BZOJ1862][HAOI2008][Zjoi2006]排名系统
[BZOJ1056][BZOJ1862][HAOI2008][Zjoi2006]排名系统 试题描述 排名系统通常要应付三种请求:上传一条新的得分记录.查询某个玩家的当前排名以及返回某个区段内的排名记录 ...
- 【BZOJ1056】[HAOI2008]排名系统(Splay)
[BZOJ1056][HAOI2008]排名系统(Splay) 题面 BZOJ 洛谷 题解 \(Splay\)随便维护一下就好了,至于名字什么的,我懒得手写哈希表了,直接哈希之后拿\(map\)压. ...
- [bzoj1056] [HAOI2008]排名系统
Description 排名系统通常要应付三种请求:上传一条新的得分记录.查询某个玩家的当前排名以及返回某个区段内的排名记录.当某个玩家上传自己最新的得分记录时,他原有的得分记录会被删除.为了减轻服务 ...
- BZOJ 1862: [Zjoi2006]GameZ游戏排名系统 [treap hash]
1862: [Zjoi2006]GameZ游戏排名系统 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1318 Solved: 498[Submit][ ...
- 【BZOJ】1862: [Zjoi2006]GameZ游戏排名系统 & 1056: [HAOI2008]排名系统(treap+非常小心)
http://www.lydsy.com/JudgeOnline/problem.php?id=1862 http://www.lydsy.com/JudgeOnline/problem.php?id ...
- 1056: [HAOI2008]排名系统 - BZOJ
Description 排名系统通常要应付三种请求:上传一条新的得分记录.查询某个玩家的当前排名以及返回某个区段内的排名记录.当某个玩家上传自己最新的得分记录时,他原有的得分记录会被删除.为了减轻服务 ...
- HNOI2008 and ZJOI2006 排名系统
1056: [HAOI2008]排名系统 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1311 Solved: 337[Submit][Statu ...
- 数据结构(Splay平衡树):HAOI2008 排名系统
[HAOI2008] 排名系统 [题目描述] 排名系统通常要应付三种请求:上传一条新的得分记录.查询某个玩家的当前排名以及返回某个区段内的排名记录.当某个玩家上传自己最新的得分记录时,他原有的得分记录 ...
- bzoj 1056 [HAOI2008]排名系统(1862 [Zjoi2006]GameZ游戏排名系统)
1056: [HAOI2008]排名系统 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1854 Solved: 502[Submit][Statu ...
随机推荐
- JavaScript 中 this:
在绑定事件时,this指定的是被绑定的那个html元素,比如: 结果: press里的this指的就是canvas.
- linux ls-al 指令详解
ls -al 具体说明请自行找男人(man 中了鸟哥的毒 =.=).
- 解决"hibernate.hbm2ddl.auto" update值 无效
<property name="schemaUpdate"> <value>true</value> </property> 若果是 ...
- TCP, Scoket, HTTP(转)
1.TCP连接 要想明白Socket连接,先要明白TCP连接.手机能够使用联网功能是因为手机底层实现了TCP/IP协议,可以使手机终端通过无线网络建立TCP连接.TCP协议可以对上层网络提供接口,使上 ...
- 【解题报告】[动态规划]RQNOJ - PID72 / 拔河比赛
原题地址:http://www.rqnoj.cn/problem/72 解题思路:基本的01背包问题. 要求的就是在这些人中选出一些人,使得这些人的体重的和 不超过所有人的体重的一半 并最大. 代码: ...
- 如何解决无法通过SSL加密与SQLServer建立连接
在部署项目时,经常会遇到驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接,错误:Java.lang.RuntimeException: Could not gene ...
- 【spring源码学习】spring的事件发布监听机制源码解析
[一]相关源代码类 (1)spring的事件发布监听机制的核心管理类:org.springframework.context.event.SimpleApplicationEventMulticast ...
- Maven根据不同的环境打包不同的配置
前言: 在开发过程中,我们的软件会面对不同的运行环境,比如开发环境.测试环境.生产环境,而我们的软件在不同的环境中,有的配置可能会不一样,比如数据源配置.日志文件配置等等. 那么就需要借助maven提 ...
- Java面试题:如何对HashMap按键值排序
Java中HashMap是一种用于存储“键”和“值”信息对的数据结构.不同于Array.ArrayList和LinkedLists,它不会维持插入元素的顺序. 因此,在键或值的基础上排序HashMap ...
- 字符串(PHP学习)
1.什么是字符串 答:一串字符组成(参考羊肉串) 2.字符串定义 答:单引号,双引号,包含单引号或双引号的字符串(1.双引号里面有单引号2.单引号里面有双引号3.转义4.字符拼接) 3.单双引号定义字 ...