BZOJ1862[Zjoi2006]GameZ游戏排名系统【splay+hash】
[Zjoi2006]GameZ游戏排名系统[Zjoi2006]GameZ游戏排名系统[Zjoi2006]GameZ游戏排名系统
Description:
- GameZ为他们最新推出的游戏开通了一个网站。世界各地的玩家都可以将自己的游戏得分上传到网站上。这样就可以看到自己在世界上的排名。得分越高,排名就越靠前。当两个玩家的名次相同时,先上传记录者优先。由于新游戏的火爆,网站服务器已经难堪重负。为此GameZ雇用了你来帮他们重新开发一套新的核心。排名系统通常要应付三种请求:上传一条新的得分记录、查询某个玩家的当前排名以及返回某个区段内的排名记录。当某个玩家上传自己最新的得分记录时,他原有的得分记录会被删除。为了减轻服务器负担,在返回某个区段内的排名记录时,最多返回10条记录。
Input Format:
- 第一行是一个整数n(n>=10)表示请求总数目。接下来n行每行包含了一个请求。请求的具体格式如下: +Name Score 上传最新得分记录。Name表示玩家名字,由大写英文字母组成,不超过10个字符。Score为最多8位的正整数。 ?Name 查询玩家排名。该玩家的得分记录必定已经在前面上传。 ?Index 返回自第Index名开始的最多10名玩家名字。Index必定合法,即不小于1,也不大于当前有记录的玩家总数。输入文件总大小不超过2M。 NOTE:用C++的fstream读大规模数据的效率较低
Output Format:
- 对于每条查询请求,输出相应结果。对于?Name格式的请求,应输出一个整数表示该玩家当前的排名。对于?Index格式的请求,应在一行中依次输出从第Index名开始的最多10名玩家姓名,用一个空格分隔。
Sample Input:
- 20
+ADAM 1000000
+BOB 1000000
+TOM 2000000
+CATHY 10000000
?TOM
?1
+DAM 100000
+BOB 1200000
+ADAM 900000
+FRANK 12340000
+LEO 9000000
+KAINE 9000000
+GRACE 8000000
+WALT 9000000
+SANDY 8000000
+MICK 9000000
+JACK 7320000
?2
?5
?KAINE
Sample Output:
- 2
CATHY TOM ADAM BOB
CATHY LEO KAINE WALT MICK GRACE SANDY JACK TOM BOB
WALT MICK GRACE SANDY JACK TOM BOB ADAM DAM
4
TJ:
首先显然能看出来是个平衡树的题目,那就用Splay搞他。
如何判断一个人的分数是否已经登记过了,那就用一个哈希表来存(这里使用了map来存),键为人名,值由分数和登记时间组成。
Splay中的各个值大小就根据每个人的得分和登记时间来比较。
1.当更新一个人的分数时,如果这个人已经更新过分数,那就在哈希表中更新这个人的分数,并且在平衡树中删去他之前的分数,然后再加入他更新之后的分数。如果没有更新过分数,那就直接在哈希表和平衡树中加入就行了。
2.查询一个人的排名,就在平衡树中查找人名对应的分数和登记时间的排名就行了。
3.查询排名为k及之后最多十个的人,先找出排名为k的人,把这个点旋转到根,然后它的右子节点以下的都是排名在它之后的,进行一次中序遍历找出9个(根节点已经是一个了)最小的就好了。
Talkischeap,showyouthecode!Talk\ is\ cheap,show\ you\ the\ code!Talk is cheap,show you the code!
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 3e5+7;
struct pii{int x,y;bool operator>(const pii &o)const{return x==o.x?y>o.y:x<o.x;}bool operator==(const pii &o)const{return x==o.x&&y==o.y;}bool operator<(const pii &o)const{return x==o.x?y<o.y:x>o.x;}
};
int n;
unordered_map<string,pii> mp;
struct Splay{#define root ch[0][1]int ch[MAXN][2],fa[MAXN],sz[MAXN],tot;pii val[MAXN];string name[MAXN];int chk(int rt){ return rt==ch[fa[rt]][1]; }void push_up(int rt){ sz[rt] = sz[ch[rt][0]]+sz[ch[rt][1]]+1; }void rorate(int rt){int f=fa[rt],gf=fa[f],d=chk(rt);ch[gf][chk(f)]=rt; fa[rt]=gf;ch[f][d]=ch[rt][d^1];fa[ch[rt][d^1]]=f;ch[rt][d^1]=f;fa[f]=rt;push_up(f); push_up(rt);}void splay(int rt,int to){to = fa[to];while(fa[rt]!=to){int f=fa[rt],gf=fa[f];if(gf==to){rorate(rt);return;}if(chk(rt)==chk(f)) rorate(f);else rorate(rt);rorate(rt);}}int CreateNode(pii v,int f,string& Name){tot++;val[tot] = v;fa[tot] = f;name[tot] = Name;sz[tot] = 1;return tot;}int find(pii x){int rt = root;while(rt){if(val[rt]==x) return rt;else if(val[rt]<x) rt = ch[rt][1];else rt = ch[rt][0];}return 0;}int rank(pii x){splay(find(x),root);return sz[ch[root][0]]+1;}void Insert(pii x,string &Name){if(!root){root = CreateNode(x,0,Name);return;}int rt = root;while(true){sz[rt]++;if(val[rt]>x){if(!ch[rt][0]){ch[rt][0] = CreateNode(x,rt,Name);splay(ch[rt][0],root);return;}rt = ch[rt][0];}else {if(!ch[rt][1]){ch[rt][1] = CreateNode(x,rt,Name);splay(ch[rt][1],root);return;}rt = ch[rt][1];}}}void Delete(pii x){splay(find(x),root);if(!ch[root][0]){root = ch[root][1];fa[root] = 0;return;}if(!ch[root][1]){root = ch[root][0];fa[root] = 0;return;}int rt = ch[root][0];while(ch[rt][1]) rt = ch[rt][1];splay(rt,ch[root][0]);ch[rt][1]=ch[root][1]; fa[ch[root][1]]=rt;root=ch[root][0]; fa[root]=0;push_up(root);}int At(int rk){int rt = root;while(rt){if(rk==sz[ch[rt][0]]+1) return rt;else if(rk<=sz[ch[rt][0]]) rt = ch[rt][0];else{rk-=sz[ch[rt][0]]+1;rt = ch[rt][1];}}return 0;}void show(int rk){splay(At(rk),root);cout<<name[root]<<' ';int cnt = 1;sw(cnt,ch[root][1]);cout<<endl;}void sw(int &cnt,int rt){if(!rt) return;sw(cnt,ch[rt][0]);if(cnt>=10) return;cnt++;cout<<name[rt]<<' ';sw(cnt,ch[rt][1]);}#undef root
}SPT;
int main(){//#define ONLINE_JUDGE#ifndef ONLINE_JUDGEfreopen("in.txt","r",stdin);#endifios_base::sync_with_stdio(false);cin.tie(0); cout.tie(0);cin>>n;string q;for(int i=1;i<=n;i++){cin>>q;if(q[0]=='+'){string name = q.substr(1,q.size()-1);int score;cin>>score;if(!mp.count(name)){mp.insert(pair<string,pii>(name,(pii){score,i}));SPT.Insert((pii){score,i},name);}else{SPT.Delete(mp[name]);SPT.Insert((pii){score,i},name);mp[name] = (pii){score,i};}}else if(q[0]=='?'){if(isdigit(q[1])){int rk = 0;for(int j=1;j<(int)q.length();j++) rk = rk*10+q[j]-'0';SPT.show(rk);}else{string name = q.substr(1,q.size()-1);cout<<SPT.rank(mp[name])<<endl;}}}return 0;
}
BZOJ1862[Zjoi2006]GameZ游戏排名系统【splay+hash】相关推荐
- luogu P2584 [ZJOI2006]GameZ游戏排名系统 Splay
luogu P2584 [ZJOI2006]GameZ游戏排名系统 Splay 实在不想调了QAQ... Code: #include <cstdio> #include <algo ...
- BZOJ 1862: [Zjoi2006]GameZ游戏排名系统 Splay
Splay的基本操作,比较繁琐..... 有个一坑点,sorce会超int 1862: [Zjoi2006]GameZ游戏排名系统 Time Limit: 5 Sec Memory Limit: 6 ...
- bzoj1862 [Zjoi2006]GameZ游戏排名系统
http://www.elijahqi.win/archives/3043 Description GameZ为他们最新推出的游戏开通了一个网站.世界各地的玩家都可以将自己的游戏得分上传到网站上.这样 ...
- 【BZOJ 1862】 [Zjoi2006]GameZ游戏排名系统
1862: [Zjoi2006]GameZ游戏排名系统 Time Limit: 5 Sec Memory Limit: 64 MB Submit: 695 Solved: 265 [Submit] ...
- bzoj 1862 [Zjoi2006]GameZ游戏排名系统
1862: [Zjoi2006]GameZ游戏排名系统 Time Limit: 5 Sec Memory Limit: 64 MB Submit: 1134 Solved: 429 [Submit ...
- 1862: [Zjoi2006]GameZ游戏排名系统(Splay)
Description GameZ为他们最新推出的游戏开通了一个网站.世界各地的玩家都可以将自己的游戏得分上传到网站上.这样就可以看到自己在世界上的排名.得分越高,排名就越靠前.当两个玩家的名次相同时 ...
- 1056/1862. [ZJOI2006]GameZ游戏排名系统【平衡树-splay】
Description GameZ为他们最新推出的游戏开通了一个网站.世界各地的玩家都可以将自己的游戏得分上传到网站上.这样就可以看到自己在世界上的排名.得分越高,排名就越靠前.当两个玩家的名次相同时 ...
- bzoj 1056 1862: [Zjoi2006]GameZ游戏排名系统(Treap+Hash)
1056: [HAOI2008]排名系统 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 2783 Solved: 790 [Submit][Sta ...
- [ZJOI2006]GameZ游戏排名系统
Description GameZ为他们最新推出的游戏开通了一个网站.世界各地的玩家都可以将自己的游戏得分上传到网站上.这样就可以看到自己在世界上的排名.得分越高,排名就越靠前.当两个玩家的名次相同时 ...
最新文章
- C++ Primer 5th笔记(chap 16 模板和泛型编程) 类模板的成员函数
- Hadoop 分布式集群搭建步骤
- Invalid VCS root mapping
- python后缀名切割_python批量将.xls转化为.xlsx,包括文件名和后缀分割
- [New Portal]Windows Azure Virtual Machine (17) Virtual Machine成本分析
- rancher添加私有仓库_使用Rancher和私有仓库快速搭建Kubernetes集群
- 联想a850 android 5.0 lollipop,手机资讯导报:全新纯净款MotoX运行Android5.0Lollipop视频曝光...
- 20、二进制转化为十进制
- No portmap or rpcbind service is running on this host
- C# button 添加logo
- Windows下安装Elasticsearch
- http之content-type
- asp.net中实现登陆的时候用SSL
- BMFont制作美术字体包教包会
- java正则表达式常用语法
- 随机搜索RandomizedSearchCV原理
- iOS 获取权限描述本地化
- 有没有完全自主的国产化数据库技术
- 49种软件验收测试方法大分享,快来看
- Python 从函数 def 到类 Class
热门文章
- 数据结构的相关练习(2)附加答案
- 许式伟:首次完整架构经验分享
- linux mint samba,linux mint 13 配置 samba
- 无法解析构造函数‘Employee(int,java.lang.String,java.lang.String,int,com.kuang.pojo.Department)‘
- 1.24版本k8s集群安装部署rook-ceph存储集群
- 小燕爱偶数C语言,C语言例题及课后练习题汇总.pdf
- [转帖]ASP.NET Core Web服务器 Kestrel和Http.sys 特性详解
- 海康摄像机rtsp地址格式
- 深度探讨互联网变现与计算广告
- 捍卫小崔, 因为民众有不靠谱的权利