这道题目我并没有AC,得分停留在81。

我用的是 Hash + Splay 。应该是因为我的 Hash 并不能很好的处理名字只有1个字母的情况。

大致说一下思路。

通过 Hash 建立或找到一名玩家的信息,并在 Splay 中实现各个操作,Hash 起到一种衔接作用。

对于本题名次的排名有一个新的约束,分数相同先上传的名次靠前。

这个我们只需要开一个结构体同时记录得分和上传时间并定义一下大小关系就可以了。

挂上未AC代码。

// q.c#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
const int M=250000+3,N=26;
struct Data {int v,t;Data():v(-1),t(-1) {}bool operator ==  (const Data &A) const {return v==A.v&&t==A.t;}bool operator > (const Data &A) const {if(v!=A.v) return v>A.v;return t<A.t;}
};
struct Hash {static const int seed=999997,mod=300007;int hash[mod+7]; char name[mod][12]; Data w[mod+4];Hash() { memset(hash,-1,sizeof(hash)); }int locate(char *s) {int len=strlen(s);unsigned int x=0;for(int i=0;i<len;i++) x=x*seed+s[i]-'A'; x%=mod;while(hash[x]!=-1&&(strcmp(name[x],s)!=0)) x++,x%=mod;return x;}Data insert(char *s,Data q) {int x=locate(s);if(hash[x]!=-1) {Data y=w[x];w[x]=q;return y;}hash[x]=1; strcpy(name[x],s); w[x]=q;return q;}
}h;
struct SplayTree {int root,cnt,l[M],r[M],f[M],s[M];char name[M][15]; Data w[M];SplayTree():root(0),cnt(0) {memset(l,0,sizeof(l));memset(r,0,sizeof(r));memset(f,0,sizeof(f));memset(s,0,sizeof(s));}void update(int x) {s[x]=s[l[x]]+s[r[x]]+1;}void l_rot(int x) {int y=f[x],z=f[y]; f[x]=z;if(z) y==l[z]?l[z]=x:r[z]=x;if(l[x]) f[l[x]]=y;r[y]=l[x],f[y]=x,l[x]=y;update(y),update(x);}void r_rot(int x) {int y=f[x],z=f[y]; f[x]=z;if(z) y==l[z]?l[z]=x:r[z]=x;if(r[x]) f[r[x]]=y;l[y]=r[x],f[y]=x,r[x]=y;update(y),update(x);}int minx(int x) {while(r[x]) x=r[x];return x;}int find(int o,Data x) {if(w[o]==x) return o;else if(x>w[o]) return find(l[o],x);else return find(r[o],x);}void splay(int x,int &p) {int y=f[x],z=f[y],q=f[p];while(y!=q) {if(z==q) x==l[y]?r_rot(x):l_rot(x);else if(x==l[y]&&y==l[z]) r_rot(y),r_rot(x);else if(x==l[y]&&y==r[z]) r_rot(x),l_rot(x);else if(x==r[y]&&y==l[z]) l_rot(x),r_rot(x);else l_rot(y),l_rot(x); y=f[x],z=f[y];}p=x;}void merge(int x,int y) {if(!x) { root=y; return ; }if(!y) { root=x; return ; }int fx=minx(x);splay(fx,x);f[y]=x,r[x]=y,root=x;update(x);}void insert(int &o,int fa,Data x,char *str) {if(!o) {o=++cnt,f[o]=fa,s[o]=1,w[o]=x;strcpy(name[o],str);}else if(x>w[o]) insert(l[o],o,x,str);else insert(r[o],o,x,str);update(o);}void delet(int o,Data x) {int po=find(root,x);splay(po,root);f[l[root]]=f[r[root]]=0;merge(l[root],r[root]);}int rank(int o,Data x) {int ans=1,po=o;while(o) {if(w[o]>x) ans+=s[l[o]]+1,po=o,o=r[o];else o=l[o];}splay(po,root);return ans;}int kth(int o,int x) {if(x>s[root]) return -1;int ans=0,po=o;while(o) {if(s[l[o]]+1==x) { ans=o,po=o; break; }else if(x<s[l[o]]+1) o=l[o];else x-=(s[l[o]]+1),o=r[o];}splay(po,root);return ans;}void dfs(int o) {if(l[o]) dfs(l[o]);printf("%d %d %s\n",w[o].v,w[o].t,name[o]);if(r[o]) dfs(r[o]);}
}tree;
int trans(char *s) {int x=0,len=strlen(s);for(int i=0;i<len;i++) x=x*10+s[i]-'0';return x;
}
void solve1(char *s,int x,int i) {Data dx; dx.v=x,dx.t=i;Data dy=h.insert(s+1,dx);if(!(dx==dy)) tree.delet(tree.root,dy);tree.insert(tree.root,0,dx,s+1);
}
void solve2(char *s) {int x=trans(s+1);for(int i=1;i<=10;i++) {int ans=tree.kth(tree.root,x+i-1);if(ans==-1) break;printf("%s ",tree.name[ans]);}printf("\n");
}
void solve3(char *s) {Data dx=h.w[h.locate(s+1)];printf("%d\n",tree.rank(tree.root,dx));
}
int main() {freopen("rank.in","r",stdin);freopen("rank.out","w",stdout);int m,x; char s[13];scanf("%d",&m);for(int i=1;i<=m;i++) {scanf("%s",s);if(s[0]=='+') scanf("%d",&x),solve1(s,x,i);else if(s[1]>='1'&&s[1]<='9') solve2(s);else solve3(s);}return 0;
}

转载于:https://www.cnblogs.com/qjs12/p/8796226.html

[HAOI2008] 排名系统相关推荐

  1. 数据结构(Splay平衡树):HAOI2008 排名系统

    [HAOI2008] 排名系统 [题目描述] 排名系统通常要应付三种请求:上传一条新的得分记录.查询某个玩家的当前排名以及返回某个区段内的排名记录.当某个玩家上传自己最新的得分记录时,他原有的得分记录 ...

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

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

  3. 【洛谷 P4291】 [HAOI2008]排名系统(Splay,Trie)

    题目链接 不是双倍经验我会去\(debug\)一上午? 一开始我是用的\(map+string\),跑的太慢了,T了4个点. 后来我手写了\(string\),重载了小于号,依然用的\(map\),T ...

  4. [HAOI2008]排名系统 [Zjoi2006]GameZ游戏排名系统 BZOJ1862BZOJ1056

    分析: 平衡树裸题,(学完LCT感觉自己不会普通的Splay了...),维护每个节点的权值大小顺序,和时间戳顺序,之后map维护一下是否存在过,(懒得写字符串hash了). 附上代码: #includ ...

  5. bzoj 1056 1862: [Zjoi2006]GameZ游戏排名系统(Treap+Hash)

    1056: [HAOI2008]排名系统 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 2783  Solved: 790 [Submit][Sta ...

  6. [洛谷P2584][ZJOI2006]GameZ游戏排名系统

    题目大意:同[洛谷P4291][HAOI2008]排名系统(双倍经验) 题解:略 卡点:无 C++ Code: #include <cstdio> #include <map> ...

  7. 快速排名系统询火星推荐_搜狗网站快速排名系统 - 新站权重如何快速提升

    原出处:超级排名系统 原文链接:http://www.chaojipaiming.com 搜狗网站快速排名系统注册地址 seo.chaojipaiming.com 网站关键词快速排名优化,7-15天关 ...

  8. 4043:GPA排名系统

    4043:GPA排名系统 查看 提交 统计 提问 时间限制:  1000ms 内存限制:  65536kB 描述 目前,高等院校往往采用GPA来评价学生的学术表现.传统的排名方式是求对每一个学生的平均 ...

  9. 抖音SEO优化源码,企业号搜索排名系统,矩阵同步分发。

    前言:抖音SEO优化源码,企业号搜索排名系统,矩阵同步分发. 抖音seo源码如何搭建?抖音seo排名优化系统软件部分源码分析,代码打包中... 场景:在 python 中,你可以使用 list[10: ...

最新文章

  1. JS简单实现自定义右键菜单
  2. 洛谷 P2335 [SDOI2005]位图
  3. 克服大数据技能差距的策略
  4. NYOJ练习题 how many hairstyles can they see?
  5. redis6持久化主从复制
  6. 【C++ Priemr | 15】虚函数表剖析(二)
  7. html读取本地txt_手机本地电子书籍阅读器 — 静读天下
  8. XManager 远程访问 Ubuntu16.04 图形界面
  9. c#窗口操作-句柄操控全解
  10. 常用数据库优化方案(五)
  11. sublime text 插件记录
  12. Shell子程序结构,函数
  13. 5.4.1. Check Constraints
  14. 云数智驱动数据高速增长,浪潮存储提供EB级容量扩展
  15. python获取当前日期所在的是本月第几周
  16. 第六天 黑马十次方 用户注册、用户登陆掌握js-cookie、微信扫码登陆、nuxt嵌套路由
  17. ios swiftui_ios swiftui中的本地化
  18. Packet(信息包)
  19. WebDAV将会在公共领域取代FTP
  20. 海藻酸钠-PEG-N-羟基琥珀酰亚胺 NHS-PEG-alginate

热门文章

  1. 基于神经网络的人工智能,人工神经网络心得体会
  2. FOTOO-疫情下,企业如何线上组织活动,输出企业文化
  3. 【Android】基于Airtest实现大麦网app自动抢票程序
  4. 下载神器aria2和他的客户端Persepolis
  5. 干货 :六招教你用Python分分钟构建好玩的深度学习应用
  6. Toy例程导读(三).高级语言分析和转换
  7. [JavaScript] JS求闭区间[min,max]的和
  8. Python4班平均成绩统计_重磅!长春12所热门高中高考成绩全部“亮相”!你看好谁?!...
  9. 贷款那些事之还款方式等额本息(一)
  10. Android中如何利用Minui显示PNG格式的图片