[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间的物品反序:第二次找到第二低的物品 ...
随机推荐
- 属性动画 常用属性及View常用方法
View类中,常用于属性动画的属性: translationX and translationY: These properties control where the View is located ...
- OpenCV-3.4.2基于Qt-5.10.1的编译
OpenCV-3.4.2基于Qt-5.10.1的编译 由于本人在使用CMake和MinGW编译OpenCV是遇到了很多问题,在这里记录下来.至于所需软件的安装和相应环境变量的设置,网上有很多详细的教程 ...
- MVC学习笔记:MVC实现用户登录验证ActionFilterAttribute用法并实现统一授权
在项目下新建一个文件夹来专门放过滤器类,首先创建一个类LoginFilter,这个类继承ActionFilterAttribute.用来检查用户是否登录和用户权限.: using System; us ...
- PB导出规定格式DBF文件 dBase 3 格式 222个字段
最近在做一个给卫计委做数据上报的数据接口,接口要求使用奇葩的dBase 3数据库存储上报数据,忙活了几天总算搞好了,使用开发工具为powerbuild 12,222个字段的上报数据表生成DBF文件,写 ...
- Js Date类型
一:格式化方法 var box=new Date(); //标准时间,如果没传参数,得到的时间为当前时间 //alert(Date.parse('4/12/2007')); //11763072000 ...
- 从windows CMD 命令行(CMD promp)运行Docker
英文原帖 Running Docker from Windows CMD prompt https://medium.com/@neil.avery_68603/running-docker-from ...
- ios 逆向工程文档汇总
iOS逆向工程工具集 http://www.jianshu.com/p/7f9511d48e05 移动App入侵与逆向破解技术-iOS篇 http://blog.csdn.net/heiby/arti ...
- 2018.8.18 servlet使用的会话跟踪除session外还有哪些方式
解释HTTP HTTP是一种无连接的协议,如果一个客户端只是单纯地请求一个文件(HTML或GIF),服务器端可以响应给客户端,并不需要知道一连串的请求是否来自于相同的客户端,而且也不需要担心客户端是否 ...
- 2017.9.21 HTML学习总结---多媒体播放系统设计
1.题目:整个页面被划分三个子窗口,上面窗口为页面功能提示区, 下左部分为不同类型播放的功能选项,下右部分为播放系统显示播放信息窗口. (1)网页设计框架: <html> <head ...
- MySQL 主从同步 Slave_IO_Running: No
MariaDB [chen]> show slave status \G *************************** 1. row ************************* ...