[bzoj1552][Cerc2007]robotic sort&&[bzoj3506][Cqoi2014]排序机械臂
非常垃圾的一道平衡树,结果被日了一天。很难受嗷嗷嗷
首先不得不说网上的题解让我这个本来就不熟悉平衡树的彩笔很难受——并不好理解。
还好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]排序机械臂的更多相关文章
- BZOJ1552[Cerc2007]robotic sort&BZOJ3506[Cqoi2014]排序机械臂——非旋转treap
题目描述 输入 输入共两行,第一行为一个整数N,N表示物品的个数,1<=N<=100000. 第二行为N个用空格隔开的正整数,表示N个物品最初排列的编号. 输出 输出共一行,N个用空格隔开 ...
- bzoj3506 [Cqoi2014]排序机械臂
bzoj3506 此题是一道比较简单的spaly题目. 用splay维护序列,将每个点排到对应的位置之后删除,这样比较容易区间翻转. 我的指针写法在洛谷上AC了,但在bzoj上RE. #include ...
- [BZOJ3506] [Cqoi2014] 排序机械臂 (splay)
Description 同OJ1552 Input Output Sample Input Sample Output HINT Source Solution Q:哎不是同一道题吗为什么分两篇博客来 ...
- 【BZOJ3506】[CQOI2014] 排序机械臂(Splay)
点此看题面 大致题意: 给你\(n\)个数.第一次找到最小值所在位置\(P_1\),翻转\([1,P_1]\),第二次找到剩余数中最小值所在位置\(P_2\),翻转\([2,P_2]\),以此类推.求 ...
- [BZOJ1552][Cerc2007]robotic sort
[BZOJ1552][Cerc2007]robotic sort 试题描述 输入 输入共两行,第一行为一个整数N,N表示物品的个数,1<=N<=100000.第二行为N个用空格隔开的正整数 ...
- 【BZOJ3506】排序机械臂(Splay)
[BZOJ3506]排序机械臂(Splay) 题面 神TMBZOJ没有题面,感谢SYC的题面 洛谷的题面也不错 题解 对于每次旋转的物体 显然可以预处理出来 现在只要模拟旋转操作就行了 至于在哪里放标 ...
- Luogu P3165 [CQOI2014]排序机械臂
先讲一下和这题一起四倍经验的题: Luogu P4402 [Cerc2007]robotic sort 机械排序 SP2059 CERC07S - Robotic Sort UVA1402 Robot ...
- P3165 [CQOI2014]排序机械臂
题目描述 为了把工厂中高低不等的物品按从低到高排好序,工程师发明了一种排序机械臂.它遵循一个简单的排序规则,第一次操作找到高度最低的物品的位置 P1P_1P1 ,并把左起第一个物品至 P1P_1P1 ...
- 洛谷P3165 [CQOI2014]排序机械臂
题目描述 为了把工厂中高低不等的物品按从低到高排好序,工程师发明了一种排序机械臂.它遵循一个简单的排序规则,第一次操作找到摄低的物品的位置P1,并把左起第一个至P1间的物品反序:第二次找到第二低的物品 ...
随机推荐
- [原创]Debian9 安装配置MariaDB
序言 这次玩次狠得.除了编译器使用yum安装,其他全部手动编译.哼~ 看似就Nginx.PHP.MySql三个东东,但是它们太尼玛依赖别人了. 没办法,想用它们就得老老实实给它们提供想要的东西. 首先 ...
- 分享一个JDK1.8丢失数字精度的案例
差异出现在 DigitList.java的 round() 方法处理上: 1.6: 1.8: 根据设置规则消除无需显示的数字时,JDK1.8 新增了一个二进制数向ASCII码转换的过程如下: 从而导致 ...
- Sliding Window - The Smallest Window II(AIZU) && Leetcode 76
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=DSL_3_B For a given array a1,a2,a3,...,aNa1 ...
- Invalid MyEclipse License - Discontinuing this MyEclipse operation. 出现这个错误怎么改正?
Invalid MyEclipse License - Discontinuing this MyEclipse operation这句话的意思是无效的许可证-停用此MyEclipse操作入门就是你的 ...
- vuejs生命周期函数
生命周期函数就是vue实例在某一个时间点会自动执行的函数 当我们创建一个实例的时候,也就是我们调用 new Vue() 这句话的时候,vue会帮助我们去创建一个实例,创建过程其实并不像我们想的那么简单 ...
- H3C S2100配置管理vlan与交换机管理IP
管理 VLAN 简介:S2100系列以太网交换机任何时刻只能有一个VLAN对应的VLAN接口可以配置IP地址,该 VLAN 即为管理 VLAN.如果要对以太网交换机进行远程管理,必须配置交换机管理 V ...
- 百度Ueditor 图片上传无反应,显示上传0张,不能点确定
解决办法: \Data\Ueditor\php\Uploader.class.php 190行左右 /** * 获取文件扩展名 * @return string */ private function ...
- CentOS 7与 Windows双系统丢失Windows启动项及默认启动项修改
1.Windows启动项消失的原因: 在安装Win7.8/10系统+CentOS7双系统后,默认会将mbr(Main Boot Record)改写为grub2,默认的CentOS7无法识别Wind ...
- js控制select选中显示不同表单内容
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Bootstarp学习教程(7) 表单
基本案例:“form-control”修饰的<input>.<textarea>和<select>元素都将被默认设置为width: 100%;表单控件包裹在&quo ...