正题

题目链接:https://www.luogu.com.cn/problem/P3850


题目大意

一个书架上有nnn本书,进行mmm次插入操作,然后qqq次询问一个位置上的书。


解题思路

用SplaySplaySplay进行插入操作,然后直接查询即可


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=2e5;
int n,m,root;char s[N][15];
int tot,t[N][2],siz[N],fa[N];
void PushUp(int x)
{siz[x]=siz[t[x][0]]+siz[t[x][1]]+1;return;}
bool Direct(int x)
{return t[fa[x]][1]==x;}
void Connect(int x,int y,int son)
{t[x][son]=y;fa[y]=x;return;}
void Rotate(int x){int y=fa[x],z=fa[fa[x]];int xs=Direct(x),ys=Direct(y);int k=t[x][xs^1];Connect(y,k,xs);Connect(x,y,xs^1);Connect(z,x,ys);PushUp(y);PushUp(x);return;
}
void Splay(int x,int f){while(fa[x]!=f){int up=fa[x];if(fa[up]==f)Rotate(x);else if(Direct(x)==Direct(up))Rotate(up),Rotate(x);else Rotate(x),Rotate(x);}return;
}
int Find(int x,int k){if(siz[t[x][0]]>=k)return Find(t[x][0],k);if(siz[t[x][0]]+1==k)return x;return Find(t[x][1],k-siz[t[x][0]]-1);
}
int main()
{scanf("%d",&n);siz[1]=1;for(int i=1;i<=n;i++){scanf("%s",s[i+1]);fa[i]=i+1;t[i+1][0]=i;PushUp(i+1);}fa[n+1]=n+2;t[n+2][0]=n+1;PushUp(n+2);root=tot=n+2;scanf("%d",&m);while(m--){scanf("%s",s[++tot]);int l;scanf("%d",&l);l++;int x=Find(root,l),y=Find(root,l+1);Splay(x,0);Splay(y,x);t[y][0]=tot;fa[tot]=y;siz[tot]=1;Splay(tot,0);root=tot;}scanf("%d",&m);while(m--){int l;scanf("%d",&l);l++;int x=Find(root,l),y=Find(root,l+2);Splay(x,0);Splay(y,x);root=x;printf("%s\n",s[t[y][0]]);}
}

P3850-[TJOI2007]书架【Splay】相关推荐

  1. luogu P3850 [TJOI2007]书架(平衡树、无旋treap(按排名分裂))

    luogu P3850 [TJOI2007]书架 这里要的是字符串,所以我们最好用一个map映射一下,不要在结构体中用string代替val. fhq-treap中所有的排名实际上都指的是前面有多少个 ...

  2. BZOJ1861:[ZJOI2006]书架(Splay)

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

  3. 洛谷 P2596 [ZJOI2006]书架 (splay)

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

  4. BZOJ 1861 ZJOI2006 Book 书架 Splay

    题目大意:--自己看懒得打了 很裸的Splay 首先开一个指针数组记录每个值代表的节点 然后就能找到某本书在序列中的什么位置了 总感觉这题可以不用Splay的说--一定是我的错觉 样例中居然尼玛有中文 ...

  5. [总结]2019年9月 OI学习/刷题记录

    从现在开始记录一下每天的学习情况.主力LOJ? 2019/9/5 LibreOJ #2543. 「JXOI2018」排序问题 答案显然是\(\frac{(n+m)!}{Cnt_1!Cnt_2!\cdo ...

  6. 模板 - FHQ - treap 无旋平衡树

    整理的算法模板合集: ACM模板 目录 FQH - treap 无旋平衡树 按权值分裂 按排名分裂 文艺平衡树 可持久化序列 FQH - treap 无旋平衡树 operator 1 : 插入一个数 ...

  7. 平衡树(模板 and 题目)记录

    平衡树 替罪羊树 #include <bits/stdc++.h>using namespace std;const double alpha = 0.725; const int N = ...

  8. fhq-Treap题目记录

    文章目录 模板 P6136 [模板]普通平衡树(数据加强版) 文艺平衡树 可持久化平衡树 书架 P3850 [TJOI2007]书架 模板 自己用的可持久化Treap的板子, 改掉split的可持久化 ...

  9. splay伸展树基础操作(bzoj 1861: [Zjoi2006]Book 书架)

    splay:一种排序树(中序遍历权值有序) 主要性质:随着访问翻转次数的增多,复杂度越来越接近logn,形态也越来越接近平衡树 主要功能:每次将要询问or删除or修改的点先一路翻转到根,然后再满足所需 ...

最新文章

  1. 虚拟网卡与物理网卡TCP协议数据传输对比
  2. hub设备_HUB选择困难症?从这里解决
  3. 移动IM开发指南2:心跳指令详解
  4. Java注解原来如此通俗易懂
  5. 数据结构——顺序栈和链式栈的简单实现和解析(C语言版)
  6. Linux下的重要目录
  7. mysql or_MySQL中or语句用法示例
  8. Linux下java环境及tomcat部署
  9. Visual C++ 6.0静态、动态链接库
  10. NB-IoT 的“前世今生”
  11. pcre和正则表达式的误点
  12. 网络运维经验分享01
  13. windows更新安装时出现此更新不适用于你的计算机的解决办法  dos 安装 msu
  14. Rational rose 安装教程
  15. 【图解算法】最小生成树
  16. 网络文件常常提到类似./run.sh的数据,这个命令的意义是什么?
  17. IDEA 官方网站 http://www.jetbrains.com/idea/
  18. 2021年美赛B题目思路(仅供参考)——AHP
  19. C++调用Python及间接调用Python三方库
  20. Arduino开发教程汇总

热门文章

  1. python程序设计实践教程陈东_Python
  2. mysql slave 1032_修复mysql slave复制1032错误
  3. mysql time类型转换_mysql8 参考手册--Date日期和Time时间类型之间的转换
  4. 全国计算机考试光盘,全国计算机一级模拟考试题(光盘).doc
  5. 使有用计算机不注意卫生,保护眼睛注意细节有哪些
  6. java emoji编码转换_java转换emoji表情
  7. 中南民族大学计算机图像处理实验报告,中南民族大学数字图像处理程序及图像...
  8. 数据结构——最短路径算法之floyd算法
  9. linux退出lftp命令,lftp命令使用
  10. C++ 学习之旅(10)——static与extern