[Luogu 2596] ZJOI2006 书架

<题目链接>


第一次指针写 FHQ_Treap(省选噩梦数据结构)AC 啦!

省选试机写它,紧张过度失败了。

省选 Day 1 考场写它,写挂了。

省选 Day 1 当晚认真复习它,结果 Day 2 并不考。

于是省选后用指针写出来了,开心qwq。

这个题嘛,记录一下每个点对应的指针,顺便维护一下父节点,每次需要的时候,就可以一路向上找到这个点的位置。

就这么简单的呀qwq

#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <stack>
using std::stack;
const int MAXN=80010;
int n,m,pos[MAXN];
class FHQ_Treap
{
public:
FHQ_Treap(void)
{
srand(19260817);
rt=nullptr;
}
~FHQ_Treap(void)
{
delete rt;
}
void Init(void)
{
Build(rt);
}
void Top(void)
{
int x;
Node *l,*r,*t;
scanf("%d",&x);
x=Rank(pos[x]);
Split(rt,x-1,l,r),Split(r,1,t,r),Merge(l,t,l),Merge(rt,l,r);
}
void Bottom(void)
{
int x;
Node *l,*r,*t;
scanf("%d",&x);
x=Rank(pos[x]);
Split(rt,x-1,l,r),Split(r,1,t,r),Merge(r,r,t),Merge(rt,l,r);
}
void Insert(void)
{
int x,k;
scanf("%d %d",&x,&k);
if(!k)
return;
Node *l,*r,*p,*q;
x=Rank(pos[x]);
if(k==-1)
Split(rt,x-2,l,r);
else
Split(rt,x-1,l,r);
Split(r,1,p,r),Split(r,1,q,r),Merge(l,l,q),Merge(r,p,r),Merge(rt,l,r);
}
void Ask(void)
{
int x;
scanf("%d",&x);
printf("%d\n",Rank(pos[x])-1);
}
void Query(void)
{
int x;
Node *l,*r,*t;
scanf("%d",&x);
Split(rt,x-1,l,r),Split(r,1,t,r);
printf("%d\n",t->v);
Merge(l,l,t),Merge(rt,l,r);
}
private:
struct Node
{
int v,p,num,size;
Node *ft,*c[2];
Node(int v=0,int p=0,int num=0,int size=0):v(v),p(p),num(num),size(size)
{
ft=c[0]=c[1]=nullptr;
}
~Node(void)
{
if(c[0]!=nullptr)
delete c[0];
if(c[1]!=nullptr)
delete c[1];
}
}*rt,*pos[MAXN];
void Update(Node *i)
{
i->size=1,pos[i->v]=i;
if(i->c[0]!=nullptr)
{
i->size+=i->c[0]->size;
i->c[0]->ft=i;
}
if(i->c[1]!=nullptr)
{
i->size+=i->c[1]->size;
i->c[1]->ft=i;
}
}
void Build(Node *&k)
{
stack<Node *> st;
for(int i=1,t;i<=n;++i)
{
scanf("%d",&t);
Node *x=new Node(t,rand(),i,1);
pos[t]=x,k=nullptr;
while(!st.empty() && x->p>st.top()->p)
Update(k=st.top()),st.pop();
if(!st.empty())
st.top()->c[1]=x;
x->c[0]=k,st.push(x);
}
while(!st.empty())
Update(k=st.top()),st.pop();
}
void Split(Node *i,int x,Node *&l,Node *&r)
{
if(i==nullptr)
{
l=r=nullptr;
return;
}
int t=(i->c[0]!=nullptr ? i->c[0]->size : 0)+1;
if(x<t)
Split((r=i)->c[0],x,l,i->c[0]);
else
Split((l=i)->c[1],x-t,i->c[1],r);
Update(i);
}
void Merge(Node *&i,Node *l,Node *r)
{
if(l==nullptr || r==nullptr)
{
i=l!=nullptr ? l : r;
return;
}
if(l->p>r->p)
Merge((i=l)->c[1],l->c[1],r);
else
Merge((i=r)->c[0],l,r->c[0]);
Update(i);
}
int Rank(Node *i)
{
int ans=(i->c[0]!=nullptr ? i->c[0]->size : 0)+1;
while(i->ft!=nullptr)
{
if(i==i->ft->c[1])
ans+=(i->ft->c[0]!=nullptr ? i->ft->c[0]->size : 0)+1;
i=i->ft;
}
return ans;
}
}*T=new FHQ_Treap;
int main(int argc,char *argv[])
{
scanf("%d %d",&n,&m);
T->Init();
for(int i=1;i<=m;++i)
{
char str[10];
scanf("\n%s",str);
switch(str[0])
{
case 'T':
T->Top();
break;
case 'B':
T->Bottom();
break;
case 'I':
T->Insert();
break;
case 'A':
T->Ask();
break;
case 'Q':
T->Query();
break;
}
}
delete T;
return 0;
}

谢谢阅读。

[Luogu 2596] ZJOI2006 书架的更多相关文章

  1. fhq_treap || BZOJ1861: [Zjoi2006]Book 书架 || Luogu P2596 [ZJOI2006]书架

    题面:P2596 [ZJOI2006]书架 题解:记录每本书对应的节点编号 普通fhq_treap无法查询一个权值的排名,所以在普通fhq_treap上多记录每个节点的父亲(可加在pushup函数中) ...

  2. 洛谷.2596.[ZJOI2006]书架(Splay)

    题目链接 /* 五个操作: 1.将某元素置顶.删掉这个数,插入最左 2.将某元素置底.同样 3.旋到根后,直接将这个数与前驱/后继交换所有信息 不是左右子节点! 4.5.裸平衡树 ps:1.用pos[ ...

  3. luogu P2596 [ZJOI2006]书架

    传送门 感觉要死在\(Splay\)里了 orz 这题用\(Splay\)维护这个序列,其中的第\(k\)大点代表这个序列的第\(k\)个数 第一个操作,先把那个数所在的点旋到根,然后把整个根的左子树 ...

  4. 「luogu2569」[ZJOI2006] 书架

    「luogu2569」[ZJOI2006]书架 题目大意 给定一个长度为 \(n\) 序列,序列中第 \(i\) 个元素有编号 \(a_i(a_i \in \Z \cap [1,n])\),需要支持五 ...

  5. [ZJOI2006]书架(权值splay)

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

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

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

  7. P2596 [ZJOI2006]书架 && Splay 区间操作(三)

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

  8. wikioi 1514 and ZJOI2006 书架

    1514 书架 0人推荐 收藏 发题解 提交代码 报错 题目描述 输入描述 输出描述 样例输入 样例输出 提示 题目描述 Description 小 T有一个很大的书柜.这个书柜的构造有些独特,即书柜 ...

  9. [BZOJ1861][ZJOI2006]书架

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

随机推荐

  1. return阻止js继续向下执行

    终止JS运行有如下几种可能: 终止函数的运行的方式有两种 在函数中使用return,则当遇到return时,函数终止执行,控制权继续向下运行 在函数中使用try-catch异常处理,需要结束时,使用t ...

  2. 解决python中文编码错误问题

    对于初学者而言,编码问题或许还没有没重视起来,但是编码问题是中文开发者必须面对的.今天来看下python开发中如何解决编码问题.注意:本篇讲的是最常见的一种编码问题,其他编码问题,如json函数引起的 ...

  3. 对编码内容多次UrlDecode

    对编码内容多次UrlDecode,并不会影响最终结果. 尝试阅读了微软的源代码,不过不容易读懂. 网址:https://referencesource.microsoft.com/#System/ne ...

  4. TCP系列04—连接管理—3、TCP连接的半打开和半关闭

    在前面部分我们我们分别介绍了三次握手.四次挥手.同时打开和同时关闭,TCP连接还有两种场景分别是半打开(Half-Open)连接和半关闭(Half-Close)连接.TCP是一个全双工(Full-Du ...

  5. 百度安卓sdk开发

    一 key问题 1 在百度地图api控制台申请key的流程主要用到了app包,开发工具的开发sha1和发布sha1值,这2个值的获取就非常关键了. 一般来说我们都是在windows上开发安卓,使用an ...

  6. Qt窗口及控件-QTreeview/QTableView排序问题

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:Qt-QTreeview/QTableView排序问题     本文地址:http://tec ...

  7. python循环解码base64

    第一次写博客,都不知道该如何下手,写的不是很好,还望各位大佬不要喷我. 先来介绍一下base64: Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打 ...

  8. WPF DataGrid的使用

    构造数据: using System; using System.Collections.Generic; using System.Linq; using System.Text; using Sy ...

  9. 【Python】python更新数据库脚本两种方法

    最近项目的两次版本迭代中,根据业务需求的变化,需要对数据库进行更新,两次分别使用了不同的方式进行更新. 第一种:使用python的MySQLdb模块利用原生的sql语句进行更新   1 import ...

  10. Eclipse闪退解决方案

    1. 找到Eclipse目录下的eclipse.exe,右键点击->发送到桌面快捷方式,然后右键点击快捷方式,选择属性,修改“目标”(或target),其中红色代表eclipse的路径,绿色代表 ...