bzoj1056: [HAOI2008]排名系统 && 1862: [Zjoi2006]GameZ游戏排名系统
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游戏排名系统的更多相关文章
- BZOJ 1862: [Zjoi2006]GameZ游戏排名系统 [treap hash]
1862: [Zjoi2006]GameZ游戏排名系统 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1318 Solved: 498[Submit][ ...
- 1056/1862. [ZJOI2006]GameZ游戏排名系统【平衡树-splay】
Description GameZ为他们最新推出的游戏开通了一个网站.世界各地的玩家都可以将自己的游戏得分上传到网站上.这样就可以看到自己在世界上的排名.得分越高,排名就越靠前.当两个玩家的名次相同时 ...
- bzoj 1056 [HAOI2008]排名系统(1862 [Zjoi2006]GameZ游戏排名系统)
1056: [HAOI2008]排名系统 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1854 Solved: 502[Submit][Statu ...
- 【BZOJ】1862: [Zjoi2006]GameZ游戏排名系统 & 1056: [HAOI2008]排名系统(treap+非常小心)
http://www.lydsy.com/JudgeOnline/problem.php?id=1862 http://www.lydsy.com/JudgeOnline/problem.php?id ...
- bzoj1056/1862 [Zjoi2006]GameZ游戏排名系统
题目链接:1,2 treap恶心题,不多说 #include<algorithm> #include<iostream> #include<cstdlib> #in ...
- bzoj 1862: [Zjoi2006]GameZ游戏排名系统 & bzoj 1056: [HAOI2008]排名系统
傻叉了一晚上,把t打成x,然后这题神奇在于输出一段数,不足的不用输出,一开始我的是直接找没有后面就退,然后这样会格式错误囧……然后最后zj的还卡了下空间,于是不用string就过了……string毁一 ...
- 【pb_ds】bzoj1056 [HAOI2008]排名系统/bzoj1862 [Zjoi2006]GameZ游戏排名系统
STL裸题,线下AC,bzoj无限RE ing…… #include<cstdio> #include<cctype> #include<iostream> #in ...
- BZOJ_1862_[Zjoi2006]GameZ游戏排名系统&&BZOJ_1056_[HAOI2008]排名系统_Splay
BZOJ_1862_[Zjoi2006]GameZ游戏排名系统&&BZOJ_1056_[HAOI2008]排名系统_Splay Description 排名系统通常要应付三种请求:上传 ...
- bzoj1862: [Zjoi2006]GameZ游戏排名系统
Description GameZ为他们最新推出的游戏开通了一个网站.世界各地的玩家都可以将自己的游戏得分上传到网站上.这样就可以看到自己在世界上的排名.得分越高,排名就越靠前.当两个玩家的名次相同时 ...
随机推荐
- PHP 归并排序
在我们日常的程序开发时候,有时候需要对一个已知的集合按照一定的规则进行排序,其实当数据的规模不太大时或者数据的有序特征比较明显,其实我们可以采用其它的排序算法例如:Bubble Sort, Inser ...
- Random类(java.util)
转自 Random类中实现的随机算法是伪随机,也就是有规则的随机.在进行随机时,随机算法的起源数字称为种子数(seed),在种子数的基础上进行一定的变换,从而产生需要的随机数字. 相同种子数的Rand ...
- db2使用Java存储过程实现MD5函数
1.数据库版本 2.Java脚本 import java.security.MessageDigest; import COM.ibm.db2.app.UDF; public class MD5UDF ...
- wpf 绑定失效的原因及解决方案
有时候,您会发现在程序开始时还能正常运行的绑定失效了.就个人经验而言,绑定的失效主要分为两种情况:对于One-way绑定而言,如果软件开发人员绕过绑定直接更改了目标属性,那么绑定将会失效.而对于Two ...
- PCB优化设计(转载)
PCB优化设计(一) 2011-04-25 11:55:36| 分类: PCB设计 目 前SMT技术已经非常成熟,并在电子产品上广泛应用,因此,电子产品设计师有必要了解SMT技术的常识和可制造性 ...
- fedora 20 PIL
今天安装PIL花了我好多的时间. 刚开始,我手动下载PIL原码,编译安装. 启动我的django项目,报下面的错误,完全不懂是么意思. CommandError: One or more models ...
- Web 高性能开发汇总
1. Http服务器: 让Windows Server 2008+IIS 7+ASP.NET支持10万个同时请求 大规模网站架构实战之体系结构(一) 大规模网站架构之WEB加速器SQUID(二) ii ...
- nodejs read/write file
fs.readFile('c:\\tmp\\helloworld.txt','utf8',function(err,data){console.log(data);}) var token=fs.re ...
- To get TaskID's Integer ID value from the GUID in SharePoint workflow
list.GetItemByUniqueId(guid).ID int itemID = spList.Items[new Guid("")].ID;
- C#实现IDispose模式
.net的GC机制有两个问题:首先GC并不能释放所有资源,它更不能释放非托管资源.其次,GC也不是实时的,所有GC存在不确定性.为了解决这个问题.NET提供了析构函数 public class Dis ...