传送门

Description

1. Top S——表示把编号为S的书放在最上面。

2. Bottom S——表示把编号为S的书放在最下面。

3. Insert S T——T∈{-1,0,1},若编号为S的书上面有X本书,则这条命令表示把这本书放回去后它的上面有X+T本书;

4. Ask S——询问编号为S的书的上面目前有多少本书。

5. Query S——询问从上面数起的第S本书的编号。

Solution

打算用它练习一下\(fhqTreap\)。

比较烦的是还要记下每个点的\(fa\)指针,才能计算它的排名

各种修改都是\(split\)然后\(merge\)一下就行了,简单

Code

#include<bits/stdc++.h>
#define ll long long
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
inline int read()
{int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}return x*f;
}
#define MN 80005
class fhqTree
{private:int pri[MN],siz[MN],id[MN],fa[MN],ls[MN],rs[MN],val[MN],rt,sz;inline unsigned int random(){static unsigned int x=23333;return x^=x<<13,x^=x>>17,x^=x<<5;}inline int up(int x){if(ls[x])fa[ls[x]]=x;if(rs[x])fa[rs[x]]=x;return siz[x]=siz[ls[x]]+siz[rs[x]]+1;}inline void Split(int x,int k,int&rt1,int&rt2){if(!x) return(void)(rt1=rt2=0);if(siz[ls[x]]>=k) Split(ls[x],k,rt1,ls[x]),up(x),rt2=x;else Split(rs[x],k-siz[ls[x]]-1,rs[x],rt2),up(x),rt1=x;}inline int Merge(int rt1,int rt2){if(!(rt1*rt2)) return rt1|rt2;if(pri[rt1]<pri[rt2]) return rs[rt1]=Merge(rs[rt1],rt2),up(rt1),rt1;else return ls[rt2]=Merge(rt1,ls[rt2]),up(rt2),rt2;}inline void Build(int &x,int l,int r){if(l>r) return;x=++sz;pri[x]=random();if(l==r) return (void)(siz[x]=1,val[x]=read(),id[val[x]]=x);int mid=(l+r)>>1;Build(ls[x],l,mid-1);val[x]=read();id[val[x]]=x;Build(rs[x],mid+1,r);up(x);}inline int find(int x){#define get(x) (rs[fa[x]]==x)int res=siz[ls[x]]+1;for(;(x^rt)&&x;x=fa[x]) if(get(x)) res+=siz[ls[fa[x]]]+1;return res;}inline void Output(int x){if(!x) return;Output(ls[x]);printf("%d %d\n",val[x],val[fa[x]]);Output(rs[x]);}public:inline void build(int n){Build(rt,1,n);}inline void output(){Output(rt);puts("");}inline void Top(int x){register int k=find(id[x]),rt1,rt2,rt3,rt4;Split(rt,k,rt1,rt2);Split(rt1,k-1,rt3,rt4);rt=Merge(rt4,Merge(rt3,rt2));}inline void Bottom(int x){register int k=find(id[x]),rt1,rt2,rt3,rt4;Split(rt,k,rt1,rt2);Split(rt1,k-1,rt3,rt4);rt=Merge(rt3,Merge(rt2,rt4));}inline void Move(int x,int T){if(!T) return;register int k=find(id[x]),rt1,rt2,rt3,rt4,rt5,rt6;Split(rt,k,rt1,rt2);Split(rt1,k-1,rt3,rt4);if(T>0) Split(rt2,1,rt5,rt6),rt=Merge(rt3,Merge(rt5,Merge(rt4,rt6)));else  Split(rt3,k-2,rt5,rt6),rt=Merge(rt5,Merge(rt4,Merge(rt6,rt2)));}inline void Ask(int x){printf("%d\n",find(id[x])-1);}inline void Query(int k){register int rt1,rt2,rt3,rt4;Split(rt,k,rt1,rt2);Split(rt1,k-1,rt3,rt4);printf("%d\n",val[rt4]);rt=Merge(rt3,Merge(rt4,rt2));}
}T;
int main()
{register int x,n=read(),m=read(),i;T.build(n);register char s[20];while(m--){scanf("%s",s);x=read();if(s[0]=='T') T.Top(x);if(s[0]=='B') T.Bottom(x);if(s[0]=='I') T.Move(x,read());if(s[0]=='A') T.Ask(x);if(s[0]=='Q') T.Query(x);}return 0;
}

Blog来自PaperCloud,未经允许,请勿转载,TKS!

转载于:https://www.cnblogs.com/PaperCloud/p/10271226.html

[bzoj 1861][zjoi2006] 书架相关推荐

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

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

  2. BZOJ 1861 ZJOI2006 Book 书架 Splay

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

  3. luogu P2596 [ZJOI2006]书架(平衡树、无旋treap(按排名分裂)一些更复杂的操作)

    P2596 [ZJOI2006]书架 无旋treap可以维护一棵树的中序遍历结果.但是不支持通过编号来找节点.于是在无旋treap的基础上,我维护了每个节点的父亲,这样就可以求出一个节点是中序遍历中的 ...

  4. BZOJ 1003: [ZJOI2006]物流运输trans

    二次联通门 : BZOJ 1003: [ZJOI2006]物流运输trans /*BZOJ 1003: [ZJOI2006]物流运输transSpfa + DpSpfa预处理出i到j天的最小花费然后N ...

  5. P2596 [ZJOI2006]书架(fhq treap)

    P2596 [ZJOI2006]书架 我们用fhq treap来完成这一题 对于一个新插入的节点我们取权值为其索引值,其所记录的valuevaluevalue是其当前索引所在位置. 操作一:把索引为v ...

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

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

  7. bzoj 1862 [Zjoi2006]GameZ游戏排名系统

    1862: [Zjoi2006]GameZ游戏排名系统 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 1134  Solved: 429 [Submit ...

  8. BZOJ 1003[ZJOI2006]物流运输(SPFA+DP)

    Problem 1003. -- [ZJOI2006]物流运输 1003: [ZJOI2006]物流运输 Time Limit: 10 Sec  Memory Limit: 162 MB Submit ...

  9. bzoj 1003: [ZJOI2006]物流运输

    1003: [ZJOI2006]物流运输 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 7819  Solved: 3273 [Submit][St ...

  10. BZOJ 1862: [Zjoi2006]GameZ游戏排名系统 Splay

    Splay的基本操作,比较繁琐..... 有个一坑点,sorce会超int 1862: [Zjoi2006]GameZ游戏排名系统 Time Limit: 5 Sec  Memory Limit: 6 ...

最新文章

  1. html导航栏重叠怎么办,请问前端大神,html如何引入另一个html,写了一个导航栏想在多个页面中如何重复使用?...
  2. WPF 4.0 DatePicker 快速录入
  3. bootstrap4 左侧导航栏 优秀 大气_Axure导出html没有左侧菜单栏(导航栏)?——Mac Safari...
  4. 在MFC里面实现线程的实例
  5. Spring IOC 如何解决循环依赖?
  6. C语言项目:灰度处理技术
  7. figma 安装插件_彩色滤光片Figma插件,用于色盲
  8. 【Pytorch神经网络理论篇】 25 基于谱域图神经网络GNN:基础知识+GNN功能+矩阵基础+图卷积神经网络+拉普拉斯矩阵
  9. LeetCode 1185. 一周中的第几天
  10. Android 短信开发学习
  11. 一文讲透数仓临时表的用法
  12. 获取和设置消息队列的属性msgctl,删除消息队列
  13. 百位云计算专家齐聚湖畔大学,阿里云MVP全球闭门会聚焦数字化转型
  14. PostgreSQL | 学习笔记语句汇总
  15. centos7修复libcrypto.so.10缺失的问题,导致ssh无法运行
  16. 阿里玄难:面向不确定性的软件设计几点思考
  17. 数据库卡顿 sp_lock和sys.dm_tran_locks的用法
  18. 发链(FAB)技术有望突破区块链交易瓶颈
  19. 透视城市“生命线” MapGIS地下管线三维建模工具
  20. python容器类型-字典

热门文章

  1. 【图像边缘检测】基于matlab最小二乘法椭圆边缘检测【含Matlab源码146期】
  2. python 句子中没有中文_使用python进行汉语分词
  3. 预测自适应滤波_使用自适应滤波的时间序列预测
  4. 转为字符数组_py字符打印照片
  5. 锁相环环路滤波器计算公式_锁相环和射频振荡器简介
  6. linux内核 semaphore,Linux内核参数信号量semaphore设置
  7. .net函数查询_SQL窗口函数
  8. MTRR内存类型范围寄存器
  9. Git : SSH 协议服务器
  10. 从魔兽世界到激战2看MMO网游角色成长