Hash_bzoj1862: [Zjoi2006]GameZ游戏排名系统
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
#define maxn 400005
#define p1 63
#define p2 103
#define mod1 1000007
#define mod2 2000007
int n,tot,len,need,fact,fa[maxn],son[maxn][],val[maxn],size[maxn];
char Name[maxn][],name[];
void read(int &x){
x=; int f=; char ch;
for (ch=getchar();!isdigit(ch);ch=getchar()) if (ch=='-') f=-;
for (;isdigit(ch);ch=getchar()) x=x*+ch-''; x*=f;
}
struct S{
int root;
void prepare(){root=,memset(son,,sizeof(son));}
int which(int x){
return son[fa[x]][]==x;
}
void updata(int x){
size[x]=;
if (son[x][]) size[x]+=size[son[x][]];
if (son[x][]) size[x]+=size[son[x][]];
}
void rotata(int x){
int y=fa[x],d=which(x),dd=which(y);
if (fa[y]) son[fa[y]][dd]=x; fa[x]=fa[y];
fa[son[x][d^]]=y,son[y][d]=son[x][d^];
fa[y]=x,son[x][d^]=y,updata(y);
}
void splay(int x,int goal){
while (fa[x]!=goal){
if (fa[fa[x]]==goal) rotata(x);
else if (which(x)==which(fa[x])) rotata(fa[x]),rotata(x);
else rotata(x),rotata(x);
}
updata(x); if (goal==) root=x;
}
void insert(int x){
int y=root; bool bo;
if (root==){
root=x; updata(x);
return;
}
for (;;){
bo=;
if (val[x]<=val[y]){
if (!son[y][]) son[y][]=x,fa[x]=y,updata(x),updata(y),bo=,splay(x,);
else y=son[y][];
}else{
if (son[y][]==) son[y][]=x,fa[x]=y,updata(x),updata(y),bo=,splay(x,);
else y=son[y][];
}
if (bo==) break;
}
}
int prep(int x){
splay(x,);
int y=son[x][];
while (son[y][]) y=son[y][];
return y;
}
void Delete(int x){
int y=prep(x),z;
if (y==){
splay(x,); z=son[x][];
root=z,son[x][]=son[x][]=fa[x]=size[x]=fa[z]=;
}else{
splay(y,),splay(x,y); z=son[x][];
fa[z]=y,son[y][]=z,updata(y);
fa[x]=son[x][]=son[x][]=size[x]=;
}
}
int rank(int x){
splay(x,);
return size[son[x][]]+;
}
int kth(int x){
int y=root; bool bo;
for (;;){
if (size[son[y][]]+==x) return y;
else if (size[son[y][]]>=x) y=son[y][];
else x-=size[son[y][]]+,y=son[y][];
}
}
void print(int x){
if (son[x][]) print(son[x][]);
fact++;
for (int i=;i<=Name[x][];i++) printf("%c",Name[x][i]);
if (fact<need) printf(" ");
if (son[x][]) print(son[x][]);
}
void query(int u,int v){
int x=kth(u-),y=kth(v+),z; fact=;
splay(x,),splay(y,x); z=son[y][];
print(z); puts("");
}
}Splay;
struct hash{
int now[mod1+],prep[maxn],Ha[maxn][];
int ha1(){
int x=;
for (int i=;i<len;i++){
x=(x+(int)name[i])%mod1*p1%mod1;
}
return x;
}
int ha2(){
int x=;
for (int i=;i<len;i++){
x=(x+(int)name[i])%mod2*p2%mod2;
}
return x;
}
bool exist(){
int x1=ha1(),x2=ha2(); bool bo=;
for (int i=now[x1];i;i=prep[i]){
if (Ha[i][]==x2){
bo=; break;
}
}
return bo;
}
int number(){
int x1=ha1(),x2=ha2();
for (int i=now[x1];i;i=prep[i]){
if (Ha[i][]==x2) return Ha[i][];
}
}
void insert(){
int x1=ha1(),x2=ha2();
prep[++tot]=now[x1],now[x1]=tot;
Ha[tot][]=x2,Ha[tot][]=tot;
for (int i=;i<len;i++) Name[tot][]++,Name[tot][Name[tot][]]=name[i];
}
}Hash;
int main(){
char op[];
memset(size,,sizeof(size));
read(n),tot=; Splay.prepare();
val[n+]=-,val[n+]=;
Splay.insert(n+),Splay.insert(n+);
for (int w,u,i=;i<=n;i++){
scanf("%s",op+);
if (op[]=='+'){
len=strlen(op+); read(w);
for (int j=;j<=len;j++) name[j-]=op[j];
if (!Hash.exist()) Hash.insert(),u=Hash.number(),val[u]=w,Splay.insert(u);
else{
u=Hash.number();
Splay.Delete(u),val[u]=w,Splay.insert(u);
}
}else if (op[]=='?'&&!isdigit(op[])){
len=strlen(op+);
for (int j=;j<=len;j++) name[j-]=op[j];
w=Hash.number();
printf("%d\n",tot-Splay.rank(w)+);
}else{
len=strlen(op+); w=;
for (int j=;j<=len;j++) w=w*+op[j]-'';
w=tot-w+;
u=max(,w-+); need=w-u+;
Splay.query(u+,w+);
}
}
return ;
}
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1862
题意参照题面。
做法:Splay+Hash。
裸的splay,支持插入删除查询排名即可,为什么要用Hash呢,因为如果某玩家上传过记录就得把之前的记录清空,所以我们需要用字符串Hash来判重,字符串我们使用双hash值,一个用来确定地址,第一个来作为val,这样就能降低在哈希表中查找的复杂度,再记录该玩家在Splay树中的标号即可。
splay+Hash。
Hash_bzoj1862: [Zjoi2006]GameZ游戏排名系统的更多相关文章
- 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游戏排名系统&&BZOJ_1056_[HAOI2008]排名系统_Splay
BZOJ_1862_[Zjoi2006]GameZ游戏排名系统&&BZOJ_1056_[HAOI2008]排名系统_Splay Description 排名系统通常要应付三种请求:上传 ...
- 1056/1862. [ZJOI2006]GameZ游戏排名系统【平衡树-splay】
Description GameZ为他们最新推出的游戏开通了一个网站.世界各地的玩家都可以将自己的游戏得分上传到网站上.这样就可以看到自己在世界上的排名.得分越高,排名就越靠前.当两个玩家的名次相同时 ...
- bzoj1862: [Zjoi2006]GameZ游戏排名系统
Description GameZ为他们最新推出的游戏开通了一个网站.世界各地的玩家都可以将自己的游戏得分上传到网站上.这样就可以看到自己在世界上的排名.得分越高,排名就越靠前.当两个玩家的名次相同时 ...
- [ZJOI2006]GameZ游戏排名系统
Description GameZ为他们最新推出的游戏开通了一个网站.世界各地的玩家都可以将自己的游戏得分上传到网站上.这样就可以看到自己在世界上的排名.得分越高,排名就越靠前.当两个玩家的名次相同时 ...
- 【BZOJ】1862: [Zjoi2006]GameZ游戏排名系统 & 1056: [HAOI2008]排名系统(treap+非常小心)
http://www.lydsy.com/JudgeOnline/problem.php?id=1862 http://www.lydsy.com/JudgeOnline/problem.php?id ...
- bzoj 1056 [HAOI2008]排名系统(1862 [Zjoi2006]GameZ游戏排名系统)
1056: [HAOI2008]排名系统 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1854 Solved: 502[Submit][Statu ...
- [HAOI2008]排名系统& [Zjoi2006]GameZ游戏排名系统
1056: [HAOI2008]排名系统 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2487 Solved: 711[Submit][Statu ...
- [洛谷P2584][ZJOI2006]GameZ游戏排名系统
题目大意:同[洛谷P4291][HAOI2008]排名系统(双倍经验) 题解:略 卡点:无 C++ Code: #include <cstdio> #include <map> ...
随机推荐
- TP框架实现分页
TP框架自带分页的实现方法,所以使用这个分页方案,不用再重新造轮子 1,先看效果图 2,源码 /** * TODO 基础分页的相同代码封装,使前台的代码更少 * @param $m 模型,引用传递 * ...
- 微软架构师解读Windows Server 2008 R2新特性
目前众多企业都开始为自己寻找一个更加适合自身发展的服务器操作平台.微软的Windows Server 2008 R2就是可以为大家解决服务器平台问题.微软最新的服务器平台Windows Server ...
- C#.NET 大型通用信息化系统集成快速开发平台 4.0 版本 - 独立子系统管理员功能实现
1: 由于公司一次性要开发10多个子系统,每个子系统都需要有相关的业务部门进行对应.2: 若用集中式管理方式,每个业务部门人员变动,权限变动时,都需要早IT信息中心进行调整,影响工作效率.及时性.3: ...
- tcpip的可靠性
- Linux shell特性
一:别名 .alias 查看本用户下的alias配置 --自定义别名:alias 别名='shell命令' (注意是单引号) --cat $HOME/.bashrc 在这个用户下配置着alias名的配 ...
- Hashtable Dictionary List 谁效率更高
一 前言 很少接触HashTable晚上回来简单看了看,然后做一些增加和移除的操作,就想和List 与 Dictionary比较下存数据与取数据的差距,然后便有了如下的一此测试, 当然我测的方法可能不 ...
- MVC+EF 理解和实现仓储模式和工作单元模式
MVC+EF 理解和实现仓储模式和工作单元模式 原文:Understanding Repository and Unit of Work Pattern and Implementing Generi ...
- SQLite剖析之体系结构
1.通过官方的SQLite架构文档,理清大体的系统层次:Architecture of SQLite 2.阅读SQLite Documentation中Technical/Design Documen ...
- foreach 和 for 循环的区别
foreach 依赖 IEnumerable. 第一次 var a in GetList() 时 调用 GetEnumerator 返回第一个对象 并 赋给a, 以后每次再执行 var a in Ge ...
- NIO框架Mina学习
前言: 找了篇文章看了看,nio框架数Mina用的最多! 代码: 服务端: package com.mina; import java.net.InetSocketAddress; import ja ...