题面

学习了如何在维护序列的平衡树上查找某个数:按初始的顺序定个权值,然后每次找那个权值的DFS序即可。具体实现就是不停往上跳,然后是父亲的右儿子就加上父亲的左儿子,剩下的就是继续熟悉无旋树堆

 #include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=;
int num[N],val[N],siz[N],anc[N],son[N][],rnk[N];
int n,m,w,x,y,z,rd,re,tot,pos,root; char ch[];
void Pushup(int nde)
{
siz[nde]=siz[son[nde][]]+siz[son[nde][]]+;
if(son[nde][]) anc[son[nde][]]=nde;
if(son[nde][]) anc[son[nde][]]=nde;
}
int Create(int tsk)
{
siz[++tot]=;
val[tot]=tsk;
num[tsk]=tot;
rnk[tot]=rand();
return tot;
}
int Merge(int x,int y)
{
if(!x||!y) return x+y;
else if(rnk[x]<=rnk[y])
{
son[x][]=Merge(son[x][],y);
Pushup(x); return x;
}
else
{
son[y][]=Merge(x,son[y][]);
Pushup(y); return y;
}
}
void Split(int nde,int &x,int &y,int tsk)
{
if(!nde) x=y=;
else
{
if(siz[son[nde][]]<tsk)
x=nde,Split(son[nde][],son[nde][],y,tsk-siz[son[nde][]]-);
else
y=nde,Split(son[nde][],x,son[nde][],tsk);
Pushup(nde);
}
}
int Query(int nde)
{
int ret=siz[son[nde][]]+;
while(anc[nde]) {
if(nde==son[anc[nde]][])
ret+=siz[son[anc[nde]][]]+;
nde=anc[nde];
}
return ret;
}
void DFS(int nde)
{
if(son[nde][]) DFS(son[nde][]);
printf("->%d",val[nde]);
if(son[nde][]) DFS(son[nde][]);
}
int main()
{
srand();
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
scanf("%d",&rd),root=Merge(root,Create(rd));
while(m--)
{
scanf("%s%d",ch,&rd),pos=Query(num[rd]);
if(ch[]=='T')
{
Split(root,x,z,pos),Split(x,x,y,pos-);
root=Merge(Merge(y,x),z);
}
else if(ch[]=='B')
{
Split(root,x,z,pos),Split(x,x,y,pos-);
root=Merge(Merge(x,z),y);
}
else if(ch[]=='I')
{
scanf("%d",&re);
if(re==-)
{
Split(root,w,z,pos),Split(w,w,y,pos-);
Split(w,w,x,pos-); root=Merge(Merge(Merge(w,y),x),z);
}
else if(re==)
{
Split(root,y,z,pos+),Split(y,x,y,pos);
Split(x,w,x,pos-); root=Merge(Merge(Merge(w,y),x),z);
}
}
else if(ch[]=='A')
printf("%d\n",pos-);
else
{
Split(root,x,z,rd),Split(x,x,y,rd-);
printf("%d\n",val[y]);
root=Merge(Merge(x,y),z);
}
}
return ;
}

解题:ZJOI 2006 书架的更多相关文章

  1. [ZJOI 2006]书架

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

  2. 解题:ZJOI 2006 皇帝的烦恼

    禁止DP,贪心真香 有一个比较明显的贪心思路是让每个人和距离为$2$(隔着一个人)的人尽量用一样的,这样只需要扫一遍然后对每对相邻的人之和取最大值即可.但是当人数为奇数时这样就会出锅,因为最后一个人和 ...

  3. 解题:ZJOI 2006 游戏排名系统

    题面 跟i207M学了学重载运算符后找前驱后继,然后就是练练无旋树堆 #include<map> #include<cstdio> #include<string> ...

  4. [ZJOI 2006]超级麻将

    Description Input 第一行一个整数N(N<=100),表示玩了N次超级麻将. 接下来N行,每行100个数a1..a100,描述每次玩牌手中各种牌的数量.ai表示数字为i的牌有ai ...

  5. [ZJOI 2006]物流运输

    Description 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的运输路线,以便对整个运输过程实施严格 ...

  6. [BZOJ1003](ZJOI 2006) 物流运输trans

    [题目描述] 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的运输路线,以便对整个运输过程实施严格的管理和跟 ...

  7. 【ZJOI 2006】 物流运输

    [题目链接] 点击打开链接 [算法] 令cost(i,j) = 第i天到第j天走相同的路线,路线长度的最小值 那么,只需筛选出第i天到第j天可以装卸货物的码头,然后将这些码头之间连边,跑弗洛伊德(或其 ...

  8. 洛谷 P2585 [ ZJOI 2006 ] 三色二叉树 —— 树形DP

    题目:https://www.luogu.org/problemnew/show/P2585 首先,三色其实记录两种状态:是绿色,不是绿色 即可,因为红蓝可以随意取反: 一开始因为懒得还原出树,所以写 ...

  9. [ ZJOI 2006 ] Trouble

    \(\\\) \(Description\) 有\(N\)个人的环,每个人需要至少\(x_i\)种不同的物品,并且要求任意相邻的两人都没有相同的物品,求最少需要多少种物品. \(N\in [0,2\t ...

随机推荐

  1. 用Python实现检测视频真伪?

    译者注:本文以一段自打24小时耳光的视频为例子,介绍了如何利用均值哈希算法来检查重复视频帧.以下是译文. 有人在网上上传了一段视频,他打了自己24个小时的耳光.他真的这么做了吗?看都不用看,肯定没有! ...

  2. NO.04--我的使用心得之使用vue绑定class名

    今天聊一聊这个话题,其实方式有很多种,我今天介绍几种我使用到的,各位看官耐心看: 一.用 变量形式 绑定单个 Class 名 在 vue 中绑定单个 class 名还好说,直接写就可以了 <te ...

  3. HDU-6315:Naive Operations(线段树+思维)

    链接:HDU-6315:Naive Operations 题意: In a galaxy far, far away, there are two integer sequence a and b o ...

  4. 3.0 zookeeper的集群介绍、搭建、环境、安装

    zookeeper是本身是一种分布式协调服务(英文意思动物园园长因为Hadoop就是一个动物园,storm.hadoop.kafkaka.hbaser都是基于zookeeper开发的) 原理:Zook ...

  5. 《算法图解》——第十章 K最近邻算法

    第十章    K最近邻算法 1 K最近邻(k-nearest neighbours,KNN)——水果分类 2 创建推荐系统 利用相似的用户相距较近,但如何确定两位用户的相似程度呢? ①特征抽取 对水果 ...

  6. ConcurrentHashMap(JDK1.8)为什么要放弃Segment

    今天看到一篇博客:jdk1.8的HashMap和ConcurrentHashMap,我想起了前段时间面试的一个问题:ConcurrentHashMap(JDK1.8)为什么要使用synchronize ...

  7. Python Tkinter-Event

    1.点击 from tkinter import * root=Tk() def printCoords(event): print(event.x,event.y) bt1=Button(root, ...

  8. [T-ARA][너 때문에 미쳐][因为你而疯了]

    歌词来源:http://music.163.com/#/song?id=5402880 作曲 : 赵英秀/김태현 [作曲 : 赵英秀/k/gim-Tae-hyeon] 作词 : 辉星 [作词 : 辉星 ...

  9. 第一次c++作业(感觉不是很好系列)

    日常先贴github的地址 https://github.com/egoistor/Elevator-scheduling 然后我觉得学习了半天,构造函数似懂非懂(用的是class自动生成的构造函数, ...

  10. fast-IO

    代码: int Scan() //输入外挂 { ,ch,flag=; if((ch=getchar())=='-') flag=; ') res=ch-'; ') res=res*+ch-'; ret ...