hash 加上 平衡树(名次树)。

这道题麻烦的地方就在于输入的是一个名字,所以需要hash。

这个hash用的是向后探查避免冲突,如果用类似前向星的方式避免冲突,比较难写,容易挂掉,但也速度快些。

mod一定要取得大一些。 hash时要减去@,否则A和B的hash值会相同导致tle。

比较难写?//蒟蒻本性。。。

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn = 1000000 + 10;
const int mod = 999983;
const int INF = 2147483647; int n,sp,p;
char s[20],name[maxn][20],op;
int res[20];
int h[maxn];
int cnt; struct Splay {
int l[maxn],r[maxn],f[maxn];
int a[maxn],s[maxn];
int root; void update(int x) {
s[x]=s[l[x]]+s[r[x]]+1;
} void lr(int x) {
int y=f[x];
r[y]=l[x];
if(l[x]) f[l[x]]=y;
f[x]=f[y];
if(root==y) root=x;
else if(l[f[y]]==y) l[f[y]]=x;
else r[f[y]]=x;
f[y]=x; l[x]=y;
update(y);
update(x);
} void rr(int x) {
int y=f[x];
l[y]=r[x];
if(r[x]) f[r[x]]=y;
f[x]=f[y];
if(root==y) root=x;
else if(l[f[y]]==y) l[f[y]]=x;
else r[f[y]]=x;
f[y]=x; r[x]=y;
update(y);
update(x);
} void rotate(int x) {
if(l[f[x]]==x) rr(x);
else lr(x);
} void splay(int x,int target=0) {
while(f[x] != target) {
if(f[f[x]]==target) rotate(x);
else if((l[f[x]]==x) == (l[f[f[x]]]==f[x])) {rotate(f[x]); rotate(x);}
else {rotate(x); rotate(x);}
}
} void insert(int pos,int val) {
int x=root,y=0;
while(x) {
y=x;
x=(val<=a[x]?l[x]:r[x]);
}
if(val<=a[y]) l[y]=pos; else r[y]=pos;
f[pos]=y; l[pos]=r[pos]=0;
a[pos]=val; s[pos]=1;
splay(pos);
} void erase(int x) {
splay(x);
if(!r[root]) {
f[l[root]]=0;
root=l[root];
}
else {
int y=r[x];
while(l[y]) y=l[y];
splay(y,root);
l[y]=l[root]; f[l[root]]=y; f[y]=0;
root=r[root];
update(root);
}
} int find(int k) {
int x=root;
while(s[r[x]]+1!=k) {
if(k<s[r[x]]+1) x=r[x];
else {k-=s[r[x]]+1; x=l[x];}
}
return x;
} int rank(int x) {
splay(x);
return s[r[x]];
} void access(int x) {
if(!x) return;
access(r[x]);
res[++sp]=x;
access(l[x]);
} void init() {
r[1]=2; f[2]=1; s[1]=2; s[2]=1; root=1; cnt=2;
a[1]=-INF; a[2]=INF;
}
}splay; int hash(char* s) {
int l=strlen(s),res=0;
for(int i=0;i<l;i++)
res=(res*27+(s[i]-'@'))%mod;
return res;
} int main() {
scanf("%d\n",&n);
splay.init();
memset(h,0,sizeof(h));
while(n--) {
while(op=getchar(),op!='?'&&op!='+');
if(op=='+') {
scanf("%s%d",s,&p);
int t=hash(s),pos=0;
while(1) {
if(!h[t]) {
pos=t; break;
}
else if(!strcmp(name[h[t]],s)) {pos=t; break;}
else {t++; if(t==(mod+1)) t=1;}
}
if(!h[pos]) {
h[pos]=++cnt;
memcpy(name[cnt],s,strlen(s));
splay.insert(cnt,p);
}
else {
splay.erase(h[pos]);
splay.insert(h[pos],p);
}
}
else {
scanf("%s",s);
if(s[0]>='0' && s[0] <='9') {
sscanf(s,"%d",&p);
int x=p+1,y=min(p+10,splay.s[splay.root]-1);
x=splay.find(x-1);
y=splay.find(y+1);
swap(x,y);
splay.splay(x); splay.splay(y,splay.root);
sp=0;
splay.access(splay.l[splay.r[splay.root]]);
for(int j=1;j<sp;j++) printf("%s ",name[res[j]]);
printf("%s\n",name[res[sp]]);
}
else {
int t=hash(s);
while(1) {
if(!strcmp(s,name[h[t]])) {
printf("%d\n",splay.rank(h[t]));
break;
}
else {t++; if(t==(mod+1)) t=1;}
}
}
}
}
return 0;
}

bzoj1056: [HAOI2008]排名系统 && 1862: [Zjoi2006]GameZ游戏排名系统的更多相关文章

  1. BZOJ 1862: [Zjoi2006]GameZ游戏排名系统 [treap hash]

    1862: [Zjoi2006]GameZ游戏排名系统 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1318  Solved: 498[Submit][ ...

  2. 1056/1862. [ZJOI2006]GameZ游戏排名系统【平衡树-splay】

    Description GameZ为他们最新推出的游戏开通了一个网站.世界各地的玩家都可以将自己的游戏得分上传到网站上.这样就可以看到自己在世界上的排名.得分越高,排名就越靠前.当两个玩家的名次相同时 ...

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

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

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

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

  5. bzoj1056/1862 [Zjoi2006]GameZ游戏排名系统

    题目链接:1,2 treap恶心题,不多说 #include<algorithm> #include<iostream> #include<cstdlib> #in ...

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

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

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

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

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

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

  9. bzoj1862: [Zjoi2006]GameZ游戏排名系统

    Description GameZ为他们最新推出的游戏开通了一个网站.世界各地的玩家都可以将自己的游戏得分上传到网站上.这样就可以看到自己在世界上的排名.得分越高,排名就越靠前.当两个玩家的名次相同时 ...

随机推荐

  1. PHP7 新特性 简介

    整理了一些常用的新特性,欢迎点赞!!! 新增操作符 1.?? $username = $_GET['user'] ?? ''; $username = isset($_GET['user']) ? $ ...

  2. MySql 服务端与客户端下载地址

    mysql官网的注册,要上传户口,才能下载. 在网上搜了个下载地址. mysql-5.6.8-rc http://mysql.stu.edu.tw/Downloads/MySQL-5.6/mysql- ...

  3. Demo学习: Collapsible Panels

    Collapsible Panels 设置TUniPanel布局属性,布局属性在Ext里是比较常用的属性,当前版本虽已经提供了布局功能,但很不完善,比如当Panel.TitlePosition=tpR ...

  4. EXTJS 4.2 资料 控件之radiogroup 的用法

    最近在EXTJS4.2开发项目,radiogroup的用法,主要是和grid之间的编辑功能:看了好多资料都不对,特此在这里备注记录 代码如下, 1.这是一段Win窗体上的两个单选按钮,设置单选按钮都是 ...

  5. C# Windows - Button 控件

    .Net Framework提供了一个派生于Control的类System.Windows.Forms.ButtonBase,它实现了Button控件所需的基本功能. System.Windows.F ...

  6. Duilib介绍以及各个类的简介

    转自http://note.sdo.com/u/icez/n/mvO-X~jyVnpFnM01A0000m DirectUI意为直接在父窗口上绘图(Paint on parent dc directl ...

  7. 3.9 spring-自定义标签解析

    到这里,我们已经完成了分析默认标签的解析与提取过程,或许设计的内容太多,我们忘了我们是冲哪个函数开始了的, 让我们再次回顾一下默认标签解析方法的起始方法. 入口如下: /** * Parse the ...

  8. HibernateTemplate、HibernateDaoSupport两种方法实现增删改查Good(转)

    Spring+Hibernate两种方法实现增删改查 首先,定义一个Customer的bean类,设置好Customer.hbm.xml文件.再定义好一个Dao接口.准备好一个jdbc.propert ...

  9. Hibernate 缓存机制二(转)

    感谢:http://www.cnblogs.com/wean/archive/2012/05/16/2502724.html 一.why(为什么要用Hibernate缓存?) Hibernate是一个 ...

  10. uva10943

    递推  还是比较容易的 /************************************************************************* > Author: ...