[ZJOI2006]书架
链接:https://www.luogu.org/problemnew/show/P2596
题解:
写了两天的平衡树终于大概弄好了所有模板(模板不熟写错debug真是要死)
对于放在头尾,只需要删除,再在头/尾插入就可以了
对于交换,就交换一下映射
代码:
#include <bits/stdc++.h>
#define maxn 100000
using namespace std;
int n,m,data[maxn],count2[maxn],leftson[maxn],rightson[maxn],fa[maxn],a[maxn],
point[maxn],num,root;
void updata(int x)
{
count2[x]=count2[leftson[x]]+count2[rightson[x]]+;
}
void rotate(int x,int y)
{
int father=fa[x];
if (y==)
{
rightson[father]=leftson[x];
if (leftson[x]) fa[leftson[x]]=father;
} else
{
leftson[father]=rightson[x];
if (rightson[x]) fa[rightson[x]]=father;
}
fa[x]=fa[father];
if (fa[father])
{
if (leftson[fa[father]]==father)
leftson[fa[father]]=x;
else rightson[fa[father]]=x;
}
fa[father]=x;
if (y==) leftson[x]=father; else rightson[x]=father;
updata(father); updata(x);
}
void splay(int x,int goal)
{
if (x==root) return;
int father=fa[x];
while (father!=goal)
{
if (fa[father]==goal)
{
if (x==leftson[father]) rotate(x,); else rotate(x,);
} else
{
if (father==leftson[fa[father]])
{
if (x==leftson[father]) rotate(father,),rotate(x,);
else rotate(x,),rotate(x,);
} else
{
if (x==rightson[father]) rotate(father,),rotate(x,);
else rotate(x,),rotate(x,);
}
}
father=fa[x];
}
if (goal==) root=x;
}
#define mid (h+t)/2
void build(int h,int t,int father,bool x,int a[maxn])
{
count2[++num]=; data[num]=a[mid]; fa[num]=father;
point[a[mid]]=num;
if (father)
{
if (x==) leftson[father]=num; else rightson[father]=num;
}
int tmp=num;
if (h<mid) build(h,mid-,tmp,,a);
if (mid<t) build(mid+,t,tmp,,a);
updata(tmp);
}
int search(int goal)
{
int x=root,cnt=;
while (x)
{
if (cnt+count2[leftson[x]]==goal) return(x);
if (count2[leftson[x]]+cnt<goal)
{
cnt+=count2[leftson[x]]+; x=rightson[x];
} else
{
x=leftson[x];
}
}
}
void delete1()
{
int x=leftson[root];
if (x==)
{
root=rightson[root]; fa[root]=; return;
}
while (rightson[x]) x=rightson[x];
splay(x,root);
rightson[x]=rightson[root];
if (rightson[root]) fa[rightson[root]]=x;
updata(x);
root=x; fa[x]=;
}
void insert1(int x)
{
int y=root;
while (leftson[y]) count2[y]++,y=leftson[y]; count2[y]++;
leftson[y]=x; fa[x]=y; leftson[x]=; rightson[x]=; count2[x]=;
}
void insert2(int x)
{
int y=root;
while (rightson[y]) count2[y]++,y=rightson[y]; count2[y]++;
rightson[y]=x; fa[x]=y; rightson[x]=; leftson[x]=; count2[x]=;
}
void print(int x)
{
if (leftson[x]) print(leftson[x]);
cout<<data[x]<<" ";
if (rightson[x]) print(rightson[x]);
}
char c[];
int main()
{
freopen("noip.in","r",stdin);
freopen("noip.out","w",stdout);
cin>>n>>m;
for (int i=;i<=n;i++)
{
cin>>a[i];
}
build(,n,,,a); root=;
for (int i=;i<=m;i++)
{
// print(root); cout<<i-1<<endl;
cin>>c; int d,e;
if (c[]=='T')
{
cin>>d; int x=point[d]; splay(x,);
delete1(); insert1(x);
}
if (c[]=='B')
{
cin>>d; int x=point[d]; splay(x,);
delete1();
insert2(x);
}
if (c[]=='I')
{
cin>>d>>e;
if (e!=)
{
int x1=point[d]; splay(x1,);
int x2=search(count2[leftson[x1]]++e);
swap(point[d],point[data[x2]]);
swap(data[x2],data[x1]);
}
}
if (c[]=='A')
{
cin>>d; int x=point[d];
splay(x,);
cout<<count2[leftson[x]]<<endl;
}
if (c[]=='Q')
{
cin>>d; int x=search(d);
cout<<data[x]<<endl;
}
}
}
[ZJOI2006]书架的更多相关文章
- 「luogu2569」[ZJOI2006] 书架
「luogu2569」[ZJOI2006]书架 题目大意 给定一个长度为 \(n\) 序列,序列中第 \(i\) 个元素有编号 \(a_i(a_i \in \Z \cap [1,n])\),需要支持五 ...
- 洛谷 P2596 [ZJOI2006]书架 解题报告
P2596 [ZJOI2006]书架 题目描述 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书, ...
- P2596 [ZJOI2006]书架 && Splay 区间操作(三)
P2596 [ZJOI2006]书架 题目描述 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书, ...
- [Luogu 2596] ZJOI2006 书架
[Luogu 2596] ZJOI2006 书架 第一次指针写 FHQ_Treap(省选噩梦数据结构)AC 啦! 省选试机写它,紧张过度失败了. 省选 Day 1 考场写它,写挂了. 省选 Day 1 ...
- fhq_treap || BZOJ1861: [Zjoi2006]Book 书架 || Luogu P2596 [ZJOI2006]书架
题面:P2596 [ZJOI2006]书架 题解:记录每本书对应的节点编号 普通fhq_treap无法查询一个权值的排名,所以在普通fhq_treap上多记录每个节点的父亲(可加在pushup函数中) ...
- [ZJOI2006]书架(权值splay)
[ZJOI2006]书架(luogu) Description 题目描述 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看 ...
- wikioi 1514 and ZJOI2006 书架
1514 书架 0人推荐 收藏 发题解 提交代码 报错 题目描述 输入描述 输出描述 样例输入 样例输出 提示 题目描述 Description 小 T有一个很大的书柜.这个书柜的构造有些独特,即书柜 ...
- [洛谷P2596] [ZJOI2006]书架
洛谷题目链接:书架 题目描述 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书,看完后放回书柜然后 ...
- BZOJ1861:[ZJOI2006]书架
浅谈\(splay\):https://www.cnblogs.com/AKMer/p/9979592.html 浅谈\(fhq\)_\(treap\):https://www.cnblogs.com ...
- luogu2596 [ZJOI2006]书架
treap.树是以"优先级"(优先级越小,在书架上越靠上)形成的,堆是以rand()的权值形成的.还要再维护一个原编号. 置顶/置底:找到那个元素,把它拉出来修改优先级再塞回去. ...
随机推荐
- .NET面试题系列(十五)yong
Redis为什么使用单进程单线程方式也这么快 Redis遍历所有key的两个命令 -- KEYS 和 SCAN 一致性Hash算法 利用一致性哈希水平拆分MySql单表 单例模式 锁 双重锁 单例模 ...
- KillerBee
KillerBee介绍 KillerBee----是攻击zigbee和IEEE 802.15.4网络的框架和工具.使用killerBee工具和一个兼容的IEEE 802.15.4无线接口,你就能窃取z ...
- C++中的memset、zeroMemory和={0}操作( 转)
使用C/C++编程时,常使用ZeroMemory.memset或 “={0}”来对结构体对象进行初始化或清零.然而这三种方式都有各自的特点,使用时需谨慎,否则容易出现严重错误,本人今日解决一个导致宕机 ...
- js scroll函数
$(function () { $(".sticky").hide(); var top = $(window).scrollTop(); if (top >= 100) { ...
- C# http get与post请求方法
public class HttpTools { public static string GetRequest(string url) { HttpWebRequest request = (Htt ...
- [CQOI2012]组装 (贪心)
CQOI2012]组装 solution: 蒟蒻表示并不会模拟退火,所以用了差分数组加贪心吗.我们先来看题: 在数轴上的某个位置修建一个组装车间 到组装车间距离的平方的最小值. 1<=n< ...
- mysql timestamp时区有影响
timestamp格式 如果数据库修改时区,可能会对数据影响,datetime不依赖数据库时区
- VS2012 安装番茄插件
1.visual assist x 1929_大番茄.rar 下载地址: http://pan.baidu.com/s/1qXOUuJE 网盘提取密码: 3mka 文件解压密码: eg5p 2.安装完 ...
- php 全局变量问题
当在函数里通过require_once包含另外php文件. 而另外php文件包含了另外php文件,而该php文件的函数需要另外的php文件. 例子: installment_maintenance_s ...
- oracle 视图 参数
创建包: create or replace package p_view_param is function set_param(num number) return number; fu ...