将要插入位置前和前前splay,再连在右子树上。

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. #include <cmath>
  6. #define R(a,b,c) for(register int a = (b); a <= (c); ++ a)
  7. #define nR(a,b,c) for(register int a = (b); a >= (c); -- a)
  8. #define Max(a,b) ((a) > (b) ? (a) : (b))
  9. #define Min(a,b) ((a) < (b) ? (a) : (b))
  10. #define Fill(a,b) memset(a, b, sizeof(a))
  11. #define Abs(a) ((a) < 0 ? -(a) : (a))
  12. #define Swap(a,b) a^=b^=a^=b
  13. #define ll long long
  14. #define ON_DEBUG
  15. #ifdef ON_DEBUG
  16. #define D_e_Line printf("\n\n----------\n\n")
  17. #define D_e(x) cout << #x << " = " << x << endl
  18. #define Pause() system("pause")
  19. #define FileOpen() freopen("in.txt","r",stdin);
  20. #else
  21. #define D_e_Line ;
  22. #define D_e(x) ;
  23. #define Pause() ;
  24. #define FileOpen() ;
  25. #endif
  26. struct ios{
  27. template<typename ATP>ios& operator >> (ATP &x){
  28. x = 0; int f = 1; char c;
  29. for(c = getchar(); c < '0' || c > '9'; c = getchar()) if(c == '-') f = -1;
  30. while(c >= '0' && c <= '9') x = x * 10 + (c ^ '0'), c = getchar();
  31. x*= f;
  32. return *this;
  33. }
  34. }io;
  35. using namespace std;
  36. const int N = 1000007;
  37. struct Tree{
  38. int ch[2], fa, val, siz;
  39. }t[N];
  40. int treeIndex,root;
  41. inline void Pushup(int rt){
  42. t[rt].siz = t[t[rt].ch[0]].siz + t[t[rt].ch[1]].siz + 1;
  43. }
  44. inline int Ident(int rt){
  45. return t[t[rt].fa].ch[1] == rt;
  46. }
  47. inline void Rotate(int x){
  48. int y = t[x].fa, z = t[y].fa, k = Ident(x);
  49. t[z].ch[Ident(y)] = x, t[x].fa = z;
  50. t[y].ch[k] = t[x].ch[k ^ 1], t[t[x].ch[k ^ 1]].fa = y;
  51. t[x].ch[k ^ 1] = y, t[y].fa = x;
  52. Pushup(y), Pushup(x);
  53. }
  54. inline void Splay(int x, int pos){
  55. while(t[x].fa != pos){
  56. int y = t[x].fa, z = t[y].fa;
  57. if(z != pos){
  58. Ident(x) == Ident(y) ? Rotate(y) : Rotate(x);
  59. }
  60. Rotate(x);
  61. }
  62. if(!pos) root = x;
  63. }
  64. inline void Insert(int x){
  65. int u = root, fa = 0;
  66. while(u && t[u].val != x){
  67. fa = u;
  68. u = t[u].ch[x > t[u].val];
  69. }
  70. if(u){
  71. return;
  72. }
  73. else{
  74. u = ++treeIndex;
  75. t[u].ch[0] = t[u].ch[1] = 0;
  76. t[u].val = x;
  77. t[u].fa = fa;
  78. t[u].siz = 1;
  79. if(fa) t[fa].ch[x > t[fa].val] = u;
  80. }
  81. Splay(u, 0);
  82. }
  83. inline int Kth(int k){
  84. int u = root;
  85. while(1){
  86. int v = t[u].ch[0];
  87. if(t[v].siz + 1 < k){
  88. k -= t[v].siz + 1;
  89. u = t[u].ch[1];
  90. }
  91. else if(v && t[v].siz >= k){ // !
  92. u = v;
  93. }
  94. else
  95. return u; // !
  96. }
  97. }
  98. char book[N][17];
  99. int main(){
  100. //FileOpen();
  101. Insert(2147483647);
  102. Insert(-2147483647);
  103. int n;
  104. io >> n;
  105. R(i,1,n){
  106. scanf("%s", book[i]);
  107. Insert(i);
  108. }
  109. int m;
  110. io >> m;
  111. R(i,1,m){
  112. scanf("%s", book[n+i]);
  113. int x;
  114. io >> x;
  115. int nxtNxt=Kth(x + 2);
  116. Splay(nxtNxt, 0);
  117. int nxt=Kth(x + 1);
  118. Splay(nxt, nxtNxt);
  119. int u = ++treeIndex;
  120. t[nxt].ch[1] = u;
  121. t[u].ch[0] = t[u].ch[1] = 0;
  122. t[u].fa = nxt;
  123. t[u].val = x + 2;
  124. t[u].siz = 1;
  125. Pushup(nxt), Pushup(nxtNxt);
  126. }
  127. int Ques;
  128. io >> Ques;
  129. while(Ques--){
  130. int x;
  131. io >> x;
  132. printf("%s\n", book[Kth(x + 2) - 2]);
  133. }
  134. return 0;
  135. }

Luogu3850 [TJOI2007]书架 (平衡树)的更多相关文章

  1. [TJOI2007]书架 题解

    文中给了你一些句子,以及让你任意插入某个位置以及查询某个位置的句子. 发现因为是句子很难搞,所以开个 map 离散一下成数字.然后在额外开一个 map 记录这个数字对应的句子. 然后你要写一种支持插入 ...

  2. P3850 [TJOI2007]书架

    题目描述 Knuth先生家里有个精致的书架,书架上有N本书,如今他想学到更多的知识,于是又买来了M本不同的新书.现在他要把新买的书依次插入到书架中,他已经把每本书要插入的位置标记好了,并且相应的将它们 ...

  3. ☆ [ZJOI2006] 书架 「平衡树维护数列」

    题目类型:平衡树 传送门:>Here< 题意:要求维护一个数列,支持:将某个元素置顶或置底,交换某元素与其前驱或后继的位置,查询编号为\(S\)的元素的排名,查询排名第\(k\)的元素编号 ...

  4. 【平衡树】【pb_ds】 bzoj1861 [Zjoi2006]Book 书架

    需要用数组记录编号为i的书的位置,和位置i处的书的编号. Code: #include<cstdio> #include<ext/pb_ds/assoc_container.hpp& ...

  5. 【山东省选2008】郁闷的小J 平衡树Treap

    小J是国家图书馆的一位图书管理员,他的工作是管理一个巨大的书架.虽然他很能吃苦耐劳,但是由于这个书架十分巨大,所以他的工作效率总是很低,以致他面临着被解雇的危险,这也正是他所郁闷的.具体说来,书架由N ...

  6. 洛谷 P2596 [ZJOI2006]书架 解题报告

    P2596 [ZJOI2006]书架 题目描述 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书, ...

  7. [洛谷P2596] [ZJOI2006]书架

    洛谷题目链接:书架 题目描述 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书,看完后放回书柜然后 ...

  8. BZOJ1861:[ZJOI2006]书架

    浅谈\(splay\):https://www.cnblogs.com/AKMer/p/9979592.html 浅谈\(fhq\)_\(treap\):https://www.cnblogs.com ...

  9. [BZOJ1861][Zjoi2006]Book 书架

    [BZOJ1861][Zjoi2006]Book 书架 试题描述 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候 ...

随机推荐

  1. Border性质习题与证明

    KMP 第一次接触 \(border\) 都是先从 KMP 开始的吧. 思想在于先对于一个串自匹配以求出 fail 指针(也就是 border) 然后就可以在匹配其他串的时候非常自然的失配转移.在此顺 ...

  2. MOS管实现的STC自动下载电路

    目录 MOSFET, MOS管基础和电路 MOS管实现的STC自动下载电路 三极管配合 PMOS 管控制电路开关 STC MCU在烧录时, 需要断电重置后才能进入烧录状态, 通常是用手按开关比较繁琐. ...

  3. Java内存分析——JavaSE基础

    内存分析 堆:存放new的对象和数组,可以被所有线程共享,不会存放别的对象引用 栈 存放基本变量类型(会包含这个基本类型的具体数值) 引用对象的变量(会存放这个引用在堆里的具体地址) 方法区(属于堆的 ...

  4. 基于.NetCore开发博客项目 StarBlog - (11) 实现访问统计

    系列文章 基于.NetCore开发博客项目 StarBlog - (1) 为什么需要自己写一个博客? 基于.NetCore开发博客项目 StarBlog - (2) 环境准备和创建项目 基于.NetC ...

  5. CabloyJS微信模块、企业微信模块已出齐

    前言 当Cabloy-企业微信模块完成时,加上之前已完成的Cabloy-微信模块,关于在CabloyJS中与微信/企业微信对接的任务已经完成了.这些模块的目标就是,只需填入各类服务的参数,就可以直接进 ...

  6. 【SpringBoot】快速入门

    博客主页:准Java全栈开发工程师 00年出生,即将进入职场闯荡,目标赚钱,可能会有人觉得我格局小.觉得俗,但不得不承认这个世界已经不再是以一条线来分割的平面,而是围绕财富旋转的球面,成为有钱人不是为 ...

  7. Mybatis架构原理(二)-二级缓存源码剖析

    Mybatis架构原理(二)-二级缓存源码剖析 二级缓存构建在一级缓存之上,在收到查询请求时,Mybatis首先会查询二级缓存,若二级缓存没有命中,再去查询一级缓存,一级缓存没有,在查询数据库; 二级 ...

  8. kali 漏洞扫描

    前言 漏洞扫描器是一种能够自动在计算机.信息系统.网络及应用软件中寻找和发现安全弱点的程序.它通过网络对目录系统进行探测,向目标系统发送数据,并将反馈数据与自带的漏洞特征库进行匹配,进而列举目标系统上 ...

  9. jenkins+k8s部署

    1. jenkins配置部署,从git或者svn等拉取代码,编制打包,在博客的jenkins那块有具体的讲解 2. 将打好的包war/java包拷贝到k8s-Master,或者在jenkins上也行, ...

  10. RPA应用场景-营业收入核对

    场景概述营业收入核对 所涉系统名称 SAP ,Excel,门店业务系统 人工操作(时间/次) 4 小时 所涉人工数量 6 操作频率每日 场景流程 1.每日13点起进入SAP查询前一日营业收入记账情况: ...