【BZOJ1056】[HAOI2008]排名系统(Splay)

题面

BZOJ

洛谷

题解

\(Splay\)随便维护一下就好了,至于名字什么的,我懒得手写哈希表了,直接哈希之后拿\(map\)压。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<map>
using namespace std;
#define ll long long
#define ull unsigned long long
#define MAX 250500
#define ls (t[x].ch[0])
#define rs (t[x].ch[1])
#define inf 2000000000
const int base=233;
inline int read()
{
int x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
map<ull,int> M;
char name[MAX][20],ch[20];
int len[MAX];
struct Node
{
int ch[2],ff;
int v,size;
}t[MAX];
int rt,n,tot;
void pushup(int x){t[x].size=t[ls].size+t[rs].size+1;}
void rotate(int x)
{
int y=t[x].ff,z=t[y].ff;
int k=t[y].ch[1]==x;
if(z)t[z].ch[t[z].ch[1]==y]=x;t[x].ff=z;
t[y].ch[k]=t[x].ch[k^1];t[t[x].ch[k^1]].ff=y;
t[x].ch[k^1]=y;t[y].ff=x;
pushup(y);pushup(x);
}
void Splay(int x,int goal)
{
while(t[x].ff!=goal)
{
int y=t[x].ff,z=t[y].ff;
if(z!=goal)
(t[y].ch[0]==x)^(t[z].ch[0]==y)?rotate(x):rotate(y);
rotate(x);
}
if(!goal)rt=x;
}
void insert(int u,int id)
{
int x=rt;
while(233)
{
if(!t[x].ch[u>t[x].v])
{
t[id].ff=x;t[id].v=u;t[id].size=1;
t[x].ch[u>t[x].v]=id;
Splay(id,0);
break;
}
else x=t[x].ch[u>t[x].v];
}
}
int Kth(int K)
{
int x=rt;
while(233)
{
if(t[ls].size+1==K)return x;
else if(t[ls].size>=K)x=ls;
else K-=t[ls].size+1,x=rs;
}
}
void Del(int x)
{
Splay(x,0);int rk=t[ls].size;
int l=Kth(rk),r=Kth(rk+2);
Splay(l,0);Splay(r,l);t[r].ch[0]=0;
pushup(r);pushup(l);
t[x].ff=t[x].size=t[x].v=0;
}
int getnum(char *s)
{
int l=strlen(s+1),ret=0;
for(int i=1;i<=l;++i)ret=ret*10+s[i]-48;
return ret;
}
ull gethash(char *s)
{
int l=strlen(s+1);ull h=0;
for(int i=1;i<=l;++i)h=h*base+s[i];
return h;
}
void Output(int x,int &sum)
{
if(sum>=10)return;
if(rs)Output(rs,sum);
if(sum>=10)return;
if(x>2)
{
++sum;
for(int i=1;i<len[x];++i)
putchar(name[x][i]);
putchar(' ');
}
if(ls)Output(ls,sum);
}
int main()
{
n=read();
insert(-inf,++tot);insert(inf,++tot);
while(n--)
{
scanf("%s",ch);
if(ch[0]=='+')
{
ull h=gethash(ch);int sco=read(),id;
if(M[h])id=M[h],Del(id),insert(sco,id);
else
{
insert(sco,M[h]=id=++tot);
for(int i=1,l=strlen(ch);i<l;++i)name[tot][i]=ch[i];
len[tot]=strlen(ch);
}
}
else if(ch[1]>='0'&&ch[1]<='9')
{
int rk=getnum(ch);
int l=Kth(tot-rk+1);
Splay(l,0);int sum=0;
Output(t[l].ch[0],sum);puts("");
}
else
{
ull h=gethash(ch);
int x=M[h];Splay(x,0);
printf("%d\n",t[rs].size);
}
if(n%200==0)Splay(rand()%tot+1,0);
}
return 0;
}

【BZOJ1056】[HAOI2008]排名系统(Splay)的更多相关文章

  1. [bzoj1056] [HAOI2008]排名系统

    Description 排名系统通常要应付三种请求:上传一条新的得分记录.查询某个玩家的当前排名以及返回某个区段内的排名记录.当某个玩家上传自己最新的得分记录时,他原有的得分记录会被删除.为了减轻服务 ...

  2. bzoj1056: [HAOI2008]排名系统 && 1862: [Zjoi2006]GameZ游戏排名系统

    hash 加上 平衡树(名次树). 这道题麻烦的地方就在于输入的是一个名字,所以需要hash. 这个hash用的是向后探查避免冲突,如果用类似前向星的方式避免冲突,比较难写,容易挂掉,但也速度快些. ...

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

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

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

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

  5. [HAOI2008]排名系统& [Zjoi2006]GameZ游戏排名系统

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

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

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

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

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

  8. 【bzoj1056】排名系统

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

  9. 2021.12.07 P4291 [HAOI2008]排名系统(Treap)

    2021.12.07 P4291 [HAOI2008]排名系统(Treap) https://www.luogu.com.cn/problem/P4291 双倍经验: https://www.luog ...

随机推荐

  1. 【H5】移动端页面根font-size设置

    h5rem.js   (配置写法①) (function (doc, win) { var docEl = doc.documentElement, resizeEvt = 'orientationc ...

  2. WPF 嵌入winform 控件

    引入 WindowsFormsIntegration.dll   和   System.Windows.Forms.dll <Window x:Class="wgscd.Window1 ...

  3. 调用聊天机器人 -小I机器人

    public static string sendMsg2(string msg) { try { msg = Uri.EscapeDataString( msg); string sUrl = &q ...

  4. Luogu P1726 上白泽慧音

    这显然是一道求强连通分量(SCC)的题目. 只要你正常,都知道应该写Tarjan. 然后(假装会写Tarjan),其实我当然不会.但是求SCC还有另一个算法.复杂度和Tarjan一样,只不过常数大了点 ...

  5. maven常用命令集

    maven常用命令 mvn compile  编译主程序源代码,不会编译test目录的源代码.第一次运行时,会下载相关的依赖包,可能会比较费时间. mvn test-compile  编译测试代码,c ...

  6. Azure 基础:File Storage

    Azure Storage 是微软 Azure 云提供的云端存储解决方案,当前支持的存储类型有 Blob.Queue.File 和 Table. 笔者在前文中介绍了 Blob Storage 的基本用 ...

  7. c++ Arx二次开发创建椭圆和样条曲线

    一.本节课程 c++ Arx二次开发创建椭圆和样条曲线 二.本节要讲解的知识点 1.如何应用C++ ARX二次开发创建椭圆(对AcDbEllipse类的构造函数的直接封装和根据外接矩形来创建椭圆) 2 ...

  8. Async 异步转同步详细流程解释

      安装 npm install async --save 地址 https://github.com/caolan/async Async的内容主要分为三部分 流程控制: 简化九种常见的流程的处理 ...

  9. Java并发编程(详解wait(), notify(),sleep())

    http://blog.csdn.net/luckyzhoustar/article/details/48179161

  10. c#版flappybird 未完全实现

    这些天开始在深圳找工作,想着把从前有些淡忘的技术再温故下.看到尊敬的<传智播客>有一期公开课,讲的是用c#编写flappybird小游戏,也就自己搜了下游戏资源,也来试试看. 其实用到的技 ...