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为他们最新推出的游戏开通了一个网站.世界各地的玩家都可以将自己的游戏得分上传到网站上.这样就可以看到自己在世界上的排名.得分越高,排名就越靠前.当两个玩家的名次相同时 ...
随机推荐
- Spark Streaming揭秘 Day33 checkpoint的使用
Spark Streaming揭秘 Day33 checkpoint的使用 今天谈下sparkstreaming中,另外一个至关重要的内容Checkpoint. 首先,我们会看下checkpoint的 ...
- java之StringBuffer
StringBuffer就是字符串缓冲区,用于存储数据的容器. 特点:长度可变,可存储不同类型的数据,最终转化成字符串使用,可以对字符串修改 功能: 添加:append(value), insert( ...
- 阿里云服务器无法远程其他的mysql服务器
1.初始化root密码 进入mysql数据库 1 mysql>update user set password=PASSWORD('123456') where User='root'; 2.允 ...
- LINQ to XML学习笔记
一.XML基础知识 1.XML:可扩展标记语言 Extensible Markup Language ,提供了一种保存数据的格式,数据可以通过这种格式很容易地在不同的应用程序之间实现共享. 2.使用X ...
- MVC5+EF6+BootStrap3.3.5 博客系统之项目搭建(一)
环境:vs2013,sql2008R2 引用版本:MVC5,EF6,BootStrap3.3.5 在之前一直都是webfrom开发,虽然开发简单:但是有很多不足的地方.在之前开发都是webfrom+M ...
- HubbleDotNet开源全文搜索组件相关资源
系统简介 HubbleDotNet 是一个基于.net framework 的开源免费的全文搜索数据库组件.开源协议是 Apache 2.0.HubbleDotNet提供了基于SQL的全文检索接口,使 ...
- 小啃机器学习(1)-----ID3和C4.5决策树
第一部分:简介 ID3和C4.5算法都是被Quinlan提出的,用于分类模型,也被叫做决策树.我们给一组数据,每一行数据都含有相同的结构,包含了一系列的attribute/value对. 其中一个属性 ...
- java小提示:标示符常见命名规则、常用ASCII
标示符常见命名规则: A:包:全部小写B:类或者接口:首字母大写:StudentC:方法或者接口:首字母小写,第二个单词开始开始,每个单词首字母大写:studentAgeD:常量:全部大写,多个单词之 ...
- 软件调试之INT 3讲解
第4章断点和单步执行 断点和单步执行是两个经常使用的调试功能,也是调试器的核心功能.本章我们将介绍IA-32 CPU是如何支持断点和单步执行功能的.前两节将分别介绍软件断点和硬件断点,第4.3节介绍用 ...
- 免费素材:25套免费的 Web UI 设计的界面元素(转)
Web 元素是任何网站相关项目都需要的,质量和良好设计的元素对于设计师来说就像宝贝一样.如果您正在为您的网站,博客,Web 应用程序或移动应用程序寻找完美设计的网页元素,那么下面这个列表会是你需要的. ...