[Luogu 2596] ZJOI2006 书架
[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 书架的更多相关文章
- fhq_treap || BZOJ1861: [Zjoi2006]Book 书架 || Luogu P2596 [ZJOI2006]书架
题面:P2596 [ZJOI2006]书架 题解:记录每本书对应的节点编号 普通fhq_treap无法查询一个权值的排名,所以在普通fhq_treap上多记录每个节点的父亲(可加在pushup函数中) ...
- 洛谷.2596.[ZJOI2006]书架(Splay)
题目链接 /* 五个操作: 1.将某元素置顶.删掉这个数,插入最左 2.将某元素置底.同样 3.旋到根后,直接将这个数与前驱/后继交换所有信息 不是左右子节点! 4.5.裸平衡树 ps:1.用pos[ ...
- luogu P2596 [ZJOI2006]书架
传送门 感觉要死在\(Splay\)里了 orz 这题用\(Splay\)维护这个序列,其中的第\(k\)大点代表这个序列的第\(k\)个数 第一个操作,先把那个数所在的点旋到根,然后把整个根的左子树 ...
- 「luogu2569」[ZJOI2006] 书架
「luogu2569」[ZJOI2006]书架 题目大意 给定一个长度为 \(n\) 序列,序列中第 \(i\) 个元素有编号 \(a_i(a_i \in \Z \cap [1,n])\),需要支持五 ...
- [ZJOI2006]书架(权值splay)
[ZJOI2006]书架(luogu) Description 题目描述 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看 ...
- 洛谷 P2596 [ZJOI2006]书架 解题报告
P2596 [ZJOI2006]书架 题目描述 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书, ...
- P2596 [ZJOI2006]书架 && Splay 区间操作(三)
P2596 [ZJOI2006]书架 题目描述 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书, ...
- wikioi 1514 and ZJOI2006 书架
1514 书架 0人推荐 收藏 发题解 提交代码 报错 题目描述 输入描述 输出描述 样例输入 样例输出 提示 题目描述 Description 小 T有一个很大的书柜.这个书柜的构造有些独特,即书柜 ...
- [BZOJ1861][ZJOI2006]书架
BZOJ Luogu Description 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书,看 ...
随机推荐
- 《javascript模式--by Stoyan Stefanov》书摘--汇总
<javascript模式--by Stoyan Stefanov>书摘--基本技巧 http://www.cnblogs.com/liubei/p/JavascriptModeLog1. ...
- iOS- iOS 和 Android 的后台推送原理各是什么?有什么区别?
iOS 的推送iOS 在系统级别有一个推送服务程序使用 5223 端口.使用这个端口的协议源于 Jabber 后来发展为 XMPP ,被用于 Gtalk 等 IM 软件中.所以, iOS 的推送,可以 ...
- C# #pragma warning disable/restore
#pragma warning 可以启用或禁用特定警告. 语法 #pragma warning disable warning-list #pragma warning restore warning ...
- opencv 和 parfor
一次遇到两个不熟悉的,因此在一起记一下. OpenCV的全称是:Open Source Computer Vision Library. OpenCv是一个基于(开源)发行的跨平台计算机视觉库,可以运 ...
- BZOJ 1305 跳舞(二分+网络流)
无法直接构造最大流来解决这个问题,因为题目要求每首舞曲都需要n对男女进行跳舞. 答案又满足单调性,这启发我们二分答案,判断是否满流验证答案. 假设舞曲数目为x时满足条件,那么每个男生和女生都需要跳x次 ...
- Go语言【第十三篇】:Go语言递归函数
Go语言递归函数 递归,就是在运行的过程中调用自己,语法格式如下: func recursion() { recursion() /* 函数调用自身 */ } func main() { recurs ...
- [2018集训队作业][UOJ450] 复读机 [DP+泰勒展开+单位根反演]
题面 传送门 思路 本文中所有$m$是原题目中的$k$ 首先,这个一看就是$d=1,2,3$数据分治 d=1 不说了,很简单,$m^n$ d=2 先上个$dp$试试 设$dp[i][j]$表示前$i$ ...
- [NOI2001]炮兵阵地 状压DP
题面: 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用“H” 表示),也可能是平原(用“P”表示),如下图.在每一格平原地形上最多 ...
- 洛谷 P4555 [国家集训队]最长双回文串 解题报告
P4555 [国家集训队]最长双回文串 题目描述 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc的顺序为abc,逆序为cba,不相同). 输入长度为\(n\)的串 ...
- [辅助软件] 微信小程序开发资源汇总 接入指南
https://github.com/justjavac/awesome-wechat-weapp https://github.com/justjavac/awesome-wechat-weapp ...