非常垃圾的一道平衡树,结果被日了一天。很难受嗷嗷嗷

首先不得不说网上的题解让我这个本来就不熟悉平衡树的彩笔很难受——并不好理解。

还好Sinogi大佬非常的神,一眼就切掉了,而且用更加美妙的解法。

题意在操作时,就是第i次把编号为i-1和编号i的后继分别提到根和根的右儿子,根的右儿子的左子树打上翻转标记。

用外部数组记录原来高度第几大的在平衡树中编号是多少。就可以直接操作了。

注意有相同的高度,离散化时直接按高度第一关键字,编号第二关键字就行了。

还有每次splay要把根到当前节点都pushdown一遍。还有先pushdown再继续操作!包括判断有没有左右儿子!

可能只有我是傻逼吧

#include<bits/stdc++.h>
using namespace std;
const int N=;
inline int read(){
int r=,c=getchar();
while(!isdigit(c))c=getchar();
while(isdigit(c))
r=r*+c-'',c=getchar();
return r;
}
#define ls ch[x][0]
#define rs ch[x][1]
int ch[N][],siz[N],fa[N],rev[N],pos[N];
int rt,tot;
struct qwq{
int v,p;
}a[N];
bool cmpv(qwq p,qwq q){
if(p.v==q.v)return p.p<q.p;
return p.v<q.v;
}
bool cmpp(qwq p,qwq q){
return p.p<q.p;
}
void pp(int x){
siz[x]=siz[ls]+siz[rs]+;
}
void pd(int x){
if(rev[x]){
rev[x]=;
swap(ls,rs);
rev[ls]^=;rev[rs]^=;
}
}
int get(int x){
return x==ch[fa[x]][];
}
void rotate(int x){
int y=fa[x],z=fa[y],px=get(x),py=get(y);
int t=ch[x][px^];
ch[x][px^]=y;fa[y]=x;
ch[y][px]=t;fa[t]=y;
if(z)ch[z][py]=x;fa[x]=z;
pp(y);
}
int s[N];
void splay(int x,int lim){
int top=;
for(int i=x;i;i=fa[i])s[++top]=i;
for(int i=top;i;i--)pd(s[i]);
int y=fa[x];
while(y^lim){
if(fa[y]^lim)
rotate(get(x)==get(y)?y:x);
rotate(x);y=fa[x];
}
rt=!lim?x:rt;pp(x);
}
int nxt(){
pd(rt);int x=ch[rt][];
while(pd(x),ch[x][])x=ch[x][];
return x;
}
int build(int l,int r){
if(l>r)return ;
int mid=l+r>>,x=++tot;
ls=build(l,mid-);fa[ls]=x;
rs=build(mid+,r);fa[rs]=x;
pos[a[mid].v]=x;
pp(x);return x;
}
int main(){
int n=read();
a[].v=,a[n+].v=n+;
for(int i=;i<=n+;i++)
a[i].v=read(),a[i].p=i;
sort(a+,a+n+,cmpv);
for(int i=;i<=n+;i++)
a[i].v=i-;
sort(a+,a+n+,cmpp);
rt=build(,n+);
for(int i=;i<=n;i++){
int x=pos[i];splay(x,);
printf("%d",siz[ls]);if(i^n)printf(" ");
x=nxt();
int y=pos[i-];
splay(y,);splay(x,rt);
rev[ls]^=;
}
}

[bzoj1552][Cerc2007]robotic sort&&[bzoj3506][Cqoi2014]排序机械臂的更多相关文章

  1. BZOJ1552[Cerc2007]robotic sort&BZOJ3506[Cqoi2014]排序机械臂——非旋转treap

    题目描述 输入 输入共两行,第一行为一个整数N,N表示物品的个数,1<=N<=100000. 第二行为N个用空格隔开的正整数,表示N个物品最初排列的编号. 输出 输出共一行,N个用空格隔开 ...

  2. bzoj3506 [Cqoi2014]排序机械臂

    bzoj3506 此题是一道比较简单的spaly题目. 用splay维护序列,将每个点排到对应的位置之后删除,这样比较容易区间翻转. 我的指针写法在洛谷上AC了,但在bzoj上RE. #include ...

  3. [BZOJ3506] [Cqoi2014] 排序机械臂 (splay)

    Description 同OJ1552 Input Output Sample Input Sample Output HINT Source Solution Q:哎不是同一道题吗为什么分两篇博客来 ...

  4. 【BZOJ3506】[CQOI2014] 排序机械臂(Splay)

    点此看题面 大致题意: 给你\(n\)个数.第一次找到最小值所在位置\(P_1\),翻转\([1,P_1]\),第二次找到剩余数中最小值所在位置\(P_2\),翻转\([2,P_2]\),以此类推.求 ...

  5. [BZOJ1552][Cerc2007]robotic sort

    [BZOJ1552][Cerc2007]robotic sort 试题描述 输入 输入共两行,第一行为一个整数N,N表示物品的个数,1<=N<=100000.第二行为N个用空格隔开的正整数 ...

  6. 【BZOJ3506】排序机械臂(Splay)

    [BZOJ3506]排序机械臂(Splay) 题面 神TMBZOJ没有题面,感谢SYC的题面 洛谷的题面也不错 题解 对于每次旋转的物体 显然可以预处理出来 现在只要模拟旋转操作就行了 至于在哪里放标 ...

  7. Luogu P3165 [CQOI2014]排序机械臂

    先讲一下和这题一起四倍经验的题: Luogu P4402 [Cerc2007]robotic sort 机械排序 SP2059 CERC07S - Robotic Sort UVA1402 Robot ...

  8. P3165 [CQOI2014]排序机械臂

    题目描述 为了把工厂中高低不等的物品按从低到高排好序,工程师发明了一种排序机械臂.它遵循一个简单的排序规则,第一次操作找到高度最低的物品的位置 P1P_1P1​ ,并把左起第一个物品至 P1P_1P1 ...

  9. 洛谷P3165 [CQOI2014]排序机械臂

    题目描述 为了把工厂中高低不等的物品按从低到高排好序,工程师发明了一种排序机械臂.它遵循一个简单的排序规则,第一次操作找到摄低的物品的位置P1,并把左起第一个至P1间的物品反序:第二次找到第二低的物品 ...

随机推荐

  1. APP常用检测

    检测设备.微信平台和app是否安装 // 检测是否安装了APP var isappinstalled = (function () { ); }()), // 检测ios设备 isIOS = (fun ...

  2. matlab练习程序(粒子群优化PSO)

    算法没有和图像处理直接相关,不过对于图像分类中的模式识别相关算法,也许会用到这个优化算法. 算法步骤: 1.首先确定粒子个数与迭代次数. 2.对每个粒子随机初始化位置与速度. 3.采用如下公式更新每个 ...

  3. centos7.4 系统安装指导

    centos7 系统安装指导 安装前规划 下载安装文件 安装过程设置 安装后系统基本设置 安装前规划 CentOS 7.x系列只有64位系统,没有32位. 生产服务器建议安装CentOS-7-x86_ ...

  4. thinkphp的find()方法获取结果

    find方法返回的是一行记录,结果是一个数组,数组的key和sql中的field相对应,假设: $res=$model->find(filed="a,b,c"); 获取结果中 ...

  5. PHP使用MySQL报no such file or directory

    原因是没有连接数据库.加上下面代码: $link = mysql_connect(DB_HOST,DB_USER,DB_PWD);mysql_select_db(DB_NAME) or die('Co ...

  6. 安卓手机下载YouTube视频的3种方法

    作为全球最大的在线视频网站,YouTube上面的内容可真是应有尽有啊,从教学视频到个人手工艺品制作流程,从各种搞笑视频到电视连续集等等,包罗万象.如果你想下载YouTube视频到电脑上面的话,网上有很 ...

  7. 创建React工程:React工程模板

    这是本人初学React做的学习笔记;讲的不是很深,只算是简单的进行介绍. 这是一个小系列.都是在同一个模板中搭建的,但是代码是不能正常执行的. >>index.js <!DOCTYP ...

  8. SAP CRM WebClient UI和Fiori UI混搭并存

    SAP CRM里有个功能可以创建HANA live report,消费HANA Studio里创建的模型. 最后创建好的report长这个样子: 具体创建步骤可以参考我的博客Step by Step ...

  9. Kruskal算法求最小生成树(POJ2485)

    题目链接:http://poj.org/problem?id=2485 #include <iostream> #include <stdio.h> #include < ...

  10. 跑groud truth的disparity

    1.用这个初始化cv::Mat M(375,1242,CV_32FC1,0.0); ,就会报以下的错误: malloc(): memory corruption: 0x000000000165df40 ...