【BZOJ1056】[HAOI2008]排名系统(Splay)
【BZOJ1056】[HAOI2008]排名系统(Splay)
题面
题解
\(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)的更多相关文章
- [bzoj1056] [HAOI2008]排名系统
Description 排名系统通常要应付三种请求:上传一条新的得分记录.查询某个玩家的当前排名以及返回某个区段内的排名记录.当某个玩家上传自己最新的得分记录时,他原有的得分记录会被删除.为了减轻服务 ...
- bzoj1056: [HAOI2008]排名系统 && 1862: [Zjoi2006]GameZ游戏排名系统
hash 加上 平衡树(名次树). 这道题麻烦的地方就在于输入的是一个名字,所以需要hash. 这个hash用的是向后探查避免冲突,如果用类似前向星的方式避免冲突,比较难写,容易挂掉,但也速度快些. ...
- 【pb_ds】bzoj1056 [HAOI2008]排名系统/bzoj1862 [Zjoi2006]GameZ游戏排名系统
STL裸题,线下AC,bzoj无限RE ing…… #include<cstdio> #include<cctype> #include<iostream> #in ...
- 数据结构(Splay平衡树):HAOI2008 排名系统
[HAOI2008] 排名系统 [题目描述] 排名系统通常要应付三种请求:上传一条新的得分记录.查询某个玩家的当前排名以及返回某个区段内的排名记录.当某个玩家上传自己最新的得分记录时,他原有的得分记录 ...
- [HAOI2008]排名系统& [Zjoi2006]GameZ游戏排名系统
1056: [HAOI2008]排名系统 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2487 Solved: 711[Submit][Statu ...
- BZOJ_1862_[Zjoi2006]GameZ游戏排名系统&&BZOJ_1056_[HAOI2008]排名系统_Splay
BZOJ_1862_[Zjoi2006]GameZ游戏排名系统&&BZOJ_1056_[HAOI2008]排名系统_Splay Description 排名系统通常要应付三种请求:上传 ...
- bzoj 1056 [HAOI2008]排名系统(1862 [Zjoi2006]GameZ游戏排名系统)
1056: [HAOI2008]排名系统 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1854 Solved: 502[Submit][Statu ...
- 【bzoj1056】排名系统
1056: [HAOI2008]排名系统 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2195 Solved: 623[Submit][Statu ...
- 2021.12.07 P4291 [HAOI2008]排名系统(Treap)
2021.12.07 P4291 [HAOI2008]排名系统(Treap) https://www.luogu.com.cn/problem/P4291 双倍经验: https://www.luog ...
随机推荐
- 20155308《网络攻防》 Exp1 PC平台逆向破解(5)M
20155308<网络攻防> Exp1 PC平台逆向破解(5)M 逆向及Bof基础实践说明 1.1 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是 ...
- python语言程序设计2
1, 代码高亮色彩体系 2, 缩进,一行代码开始前的空白区域,表达程序的格式框架 单层缩进,多层缩进 特点 概念,缩进是语法的一部分,缩进不正确的话可能会导致程序运行错误 用处(意义),是表达代码间包 ...
- mongodb安装教程
MongoDB 下载及安装 MongoDB 提供了可用于 32 位和 64 位系统的预编译二进制包,你可以从MongoDB官网下载安装,MongoDB 预编译二进制包下载地址:https://www. ...
- C#调用python文件执行
我的电脑环境是使用.net framework4.5.1,如果在调试过程中调不通请注意 我用的是Visual studion 2017,python组件下载地址:http://ironpython.c ...
- Mysql的基本操作(一)增、删、改
创建/增加(create创建,alter字段操作,insert插入) 创建数据库 create database 数据库名称 charset=utf8; # 例: create database te ...
- Runtime.getRuntime().addShutdownHook(Thread thread) 程序关闭时钩子,优雅退出程序
根据 Java API, 所谓 shutdown hook 就是已经初始化但尚未开始执行的线程对象.在Runtime 注册后,如果JVM要停止前,这些 shutdown hook 便开始执行.也就是在 ...
- 接口自动化测试框架-AIM
最近在做公司项目的自动化接口测试,在现有几个小框架的基础上,反复研究和实践,搭建了新的测试框架.利用业余时间,把框架总结了下来. AIM框架介绍 AIM,是Automatic Interface Mo ...
- springboot 异步调用Async使用方法
引言: 在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的:但是在处理与第三方系统交互的时候,容易造成响应迟缓的情况,之前大部分都是使用多线程来完成此类任务,其实,在spring 3. ...
- LeetCode 463. Island Perimeter岛屿的周长 (C++)
题目: You are given a map in form of a two-dimensional integer grid where 1 represents land and 0 repr ...
- 基于 Java Web 的毕业设计选题管理平台--测试报告与用户手册
一.测试报告 1.兼容性测试 功能 描述 效果 Chrome浏览器 FireFox浏览器 IE浏览器 war 端浏览器 管理员登录 管理员用户登录功能 弹出“登录成功”对话框,进入到毕业设计选题管理平 ...