[BZOJ 1056][HAOI2008]排名系统
\(\color{green}{solution}\)
\(fhq \_treap\)模板题.
对于 \(+\) 操作,如果当前人不存在,那么直接加入;如果存在,那么先将他删除,再加入.复杂度\(O(n \log n)\)
对于 \(?\) 操作,如果问人,直接查找名次;如果问名次,先将它前面的\(split\)出去,再把它后面\(10\)个\(split\)
出去,然后输出即可.复杂度均为\(O(n \log n)\).
所以总复杂度是\(O(n \log n)\) 的.具体细节请参见代码.
#include <bits/stdc++.h>
using namespace std;
#define pii pair<int, int>
#define mp make_pair
const int maxn = 250010;
bool operator < (const pii &a, const pii &b) {
return a.first == b.first ? a.second < b.second : a.first > b.first;
}
struct node {node *ls, *rs; pii a; int sz, ky, id;};
node *root, pool[maxn], *pis = pool, *nul, *Bc[maxn];
int bc_top;
inline void init() {
nul = pis; nul->ls = nul->rs = nul; nul->sz = 0; root = nul;
}
node *newnode(int val, int tim, int opt) {
node *k = bc_top ? Bc[bc_top --] : ++ pis;
k->ls = k->rs = nul; k->sz = 1; k->ky = rand(); k->id = opt;
k->a = mp(val, tim); return k;
}
inline void up(node *&x) { x->sz = x->ls->sz + x->rs->sz + 1;}
inline void mrg(node *&c, node *x, node *y) {
if( x == nul || y == nul) {c = x == nul ? y : x; return;}
if( x->ky < y->ky) c = x, mrg(c->rs, x->rs, y);
else c = y, mrg(c->ls, x, y->ls); up(c);
}
inline void spl(node *c, node *&x, node *&y, int ret) {
if( c == nul) { x = y = nul; return;}
if( c->ls->sz+1 <= ret) x = c, spl(c->rs, x->rs, y, ret-c->ls->sz-1);
else y = c, spl(c->ls, x, y->ls, ret); up(c);
}
int find(node *c, pii x) {
if( c->a == x) return c->ls->sz + 1;
if( c->a < x) return c->ls->sz + 1 + find(c->rs, x);
return find(c->ls, x);
}
inline void erase(pii val) {
int rk = find(root, val);
node *x, *y, *z; spl(root, x, y, rk); spl(x, x, z, rk-1);
mrg(root, x, y); Bc[++ bc_top] = z;
}
inline void sp_spl(node *c, node *&x, node *&y, int ret) {
if( c == nul) { x = y = nul; return;}
if( c->a.first >= ret) x = c, sp_spl(c->rs, x->rs, y, ret);
else y = c, sp_spl(c->ls, x, y->ls, ret); up(c);
}
pii Rank[maxn];
int Idc;
inline void insert(int val, int tim, int &id) {
if( id) erase(Rank[id]); else id = ++ Idc;
node *x, *y; Rank[id] = mp(val, tim);
sp_spl(root, x, y, val);
mrg(x, x, newnode(val, tim, id)); mrg(root, x, y);
}
map<string, int> Id;
char buf[maxn][20], ss[20], *tt;
int getnum(char *s) {
int x = 0; for ( ; !isdigit(*s); ++ s);
for ( ; isdigit(*s); ++ s) x = (x << 1) + (x << 3) + (*s & 15);
return x;
}
inline void out(node *x) {
if(x == nul) return; out(x->ls); printf("%s ", buf[x->id]); out(x->rs);
}
int n;
inline void sol1(int rk) {
node *x, *y, *z;
spl(root, x, y, rk-1); spl(y, z, y, 10);
out(z); puts("");
mrg(y, z, y); mrg(root, x, y);
}
int main() {
#ifndef ONLINE_JUDGE
// freopen("1.in","r",stdin);
#endif
init();
scanf("%d", &n);
for ( register int i = 1, x; i <= n; ++ i) {
scanf("%s", ss); tt = ss;
if( *ss == '+') {
++ tt; scanf("%d", &x); insert(x, i, Id[tt]);
int k = Id[tt];
if( k == Idc) memcpy(buf[k], tt, sizeof(buf[k]));
}
else {
++ tt;
if( isdigit(*tt)) sol1(getnum(tt));
else printf("%d\n", find(root, Rank[Id[tt]]));
}
}
return 0;
}

[BZOJ 1056][HAOI2008]排名系统的更多相关文章
- 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游戏排名系统 & bzoj 1056: [HAOI2008]排名系统
傻叉了一晚上,把t打成x,然后这题神奇在于输出一段数,不足的不用输出,一开始我的是直接找没有后面就退,然后这样会格式错误囧……然后最后zj的还卡了下空间,于是不用string就过了……string毁一 ...
- 【BZOJ】1862: [Zjoi2006]GameZ游戏排名系统 & 1056: [HAOI2008]排名系统(treap+非常小心)
http://www.lydsy.com/JudgeOnline/problem.php?id=1862 http://www.lydsy.com/JudgeOnline/problem.php?id ...
- 1056: [HAOI2008]排名系统 - BZOJ
Description 排名系统通常要应付三种请求:上传一条新的得分记录.查询某个玩家的当前排名以及返回某个区段内的排名记录.当某个玩家上传自己最新的得分记录时,他原有的得分记录会被删除.为了减轻服务 ...
- bzoj 1862/1056 [HAOI2008]排名系统
原题链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1862 很恶心的 一道题,我也不晓得自己是第几次写这题了%>_<%. 写了两种方 ...
- [HAOI2008]排名系统& [Zjoi2006]GameZ游戏排名系统
1056: [HAOI2008]排名系统 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2487 Solved: 711[Submit][Statu ...
- 【BZOJ1056】[HAOI2008]排名系统(Splay)
[BZOJ1056][HAOI2008]排名系统(Splay) 题面 BZOJ 洛谷 题解 \(Splay\)随便维护一下就好了,至于名字什么的,我懒得手写哈希表了,直接哈希之后拿\(map\)压. ...
- 数据结构(Splay平衡树):HAOI2008 排名系统
[HAOI2008] 排名系统 [题目描述] 排名系统通常要应付三种请求:上传一条新的得分记录.查询某个玩家的当前排名以及返回某个区段内的排名记录.当某个玩家上传自己最新的得分记录时,他原有的得分记录 ...
- BZOJ_1862_[Zjoi2006]GameZ游戏排名系统&&BZOJ_1056_[HAOI2008]排名系统_Splay
BZOJ_1862_[Zjoi2006]GameZ游戏排名系统&&BZOJ_1056_[HAOI2008]排名系统_Splay Description 排名系统通常要应付三种请求:上传 ...
随机推荐
- jsoncpp学习
// MyJsonTest.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <fstream> #includ ...
- 【分享】Java后台开发精选知识图谱
地址 引言: 学习一个新的技术时,其实不在于跟着某个教程敲出了几行.几百行代码,这样你最多只能知其然而不知其所以然,进步缓慢且深度有限,最重要的是一开始就对整个学习路线有宏观.简洁的认识,确定大的学习 ...
- ZSTU4274 约素 2017-03-22 17:11 66人阅读 评论(0) 收藏
4274: 约素 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 1807 Solved: 467 Description 判断一个正整数n的约数个数 ...
- web项目开发最佳做法
一个成熟的web项目应该具备以下基础代码或做法 1.前端基础框架: 统一的ajax 通信/表单提交及调用结果弹窗显示 统一的数据验证 统一的数据列表 2.后端基础框架: 统一的异常处理捕获,可针对具体 ...
- Jenkins pipeline中使用内置全局变量
在pipeline中不像在windows batch command中直接%WORKSPACE%这样 需要写成这样: echo env.WORKSPACE
- C++ windows进程间通信
最近一直在找共享内存同步的操作,恰好这篇文章有讲解.本文转载:https://blog.csdn.net/bing_bing_bing_/article/details/82875302 方便记录,c ...
- ES6学习之const声明常量的学习
在ES中const关键字用来声明常量,const声明的一经定义不能修改 和let特性差不多, ; console.log(a); a = ; //报错 const定义完常量后必须赋值,后面不允许再次赋 ...
- CSS文字大小单位PX、EM的区别
◆px像素(Pixel)是相对长度单位,像素px是相对于显示器屏幕分辨率而言的.(引自CSS2.0手册)◆em是相对长度单位,相对于当前对象内文本的字体尺寸.如当前对行内文本的字体尺寸未被人为设置,则 ...
- 【OCP 12c】最新CUUG OCP-071考试题库(62题)
62.(13-17)choose the best answer: You need to list the employees in DEPARTMENT_ID 30 in a single row ...
- 【OCP|052】OCP 11g最新考题收集整理-第6题
6.You are installing Oracle Grid Infrastructure by using the Oracle Universal Installer (OUI). You s ...