【BZOJ3506】【Cqoi2014】排序机械臂
传送门(因为BZOJ上没有题面...所以放的是luogu的)
题意:你需要维护一个序列,支持区间翻转与查询区间最小。
解题思路:由于区间最小实际上每一次就是对应的整个数列的第k小,因此可以直接预处理解决,接下来考虑如何找到这个点,可以直接用一个指针解决,然后就是简单的无旋treap操作:
给定一个平衡树上节点,求它在当前序列中的下标,首先我们先将这个点到平衡树根节点的标记下传,使用递归解决,然后就直接根据BST的性质查找即可。
其余的就是按照题意进行区间rotate,这是无旋treap的简单操作之一,不多赘述。
代码中还有很多东西是可以优化的,例如不需要存储val,可以舍弃已经有序的区间等,如果你能做到的话,应该是轻松Rank1的节奏?
#include <stdio.h>
#include <algorithm>
#define r register
#define MN 100005
#define getchar() (S==TT&&(TT=(S=BB)+fread(BB,1,1<<15,stdin),TT==S)?EOF:*S++)
char BB[<<],*S=BB,*TT=BB;
inline int in(){
r int x=; r bool f=; r char c;
for (;(c=getchar())<''||c>'';f=c=='-');
for (x=c-'';(c=getchar())>=''&&c<='';x=(x<<)+(x<<)+c-'');
return f?-x:x;
}
namespace Treap{
inline int Rand(){
static int x=;
return x^=x<<,x^=x>>,x^=x<<;
}
struct node{
node *ls,*rs,*fa;
int val,sz,pri;bool rev;
inline void reverse(){std::swap(ls,rs);if (ls) ls->rev^=;if (rs) rs->rev^=;rev=;}
inline void pushdown(){if (rev) reverse();}
inline void combine(){
sz=;if (ls) sz+=ls->sz,ls->fa=this;
if (rs) sz+=rs->sz,rs->fa=this;
}
node(int val):val(val){sz=,pri=Rand(),rev=,fa=ls=rs=NULL;}
}*root,*pos[MN];
struct Droot{node *a,*b;};
inline int Size(node *x){return x?x->sz:;}
node *merge(node *a,node *b){
if (!a) return b;if (!b) return a;
if (a->pri<b->pri){
a->pushdown();
a->rs=merge(a->rs,b);
a->combine();return a;
}else{
b->pushdown();
b->ls=merge(a,b->ls);
b->combine();return b;
}
}
Droot split(node *x,int k){
if (!x) return (Droot){NULL,NULL};
r Droot y;x->pushdown();
if (k<=Size(x->ls)){
y=split(x->ls,k);
x->ls=y.b;x->combine();y.b=x;
}else{
y=split(x->rs,k-Size(x->ls)-);
x->rs=y.a;x->combine();y.a=x;
}return y;
}
inline void Rotate(node *x){if (!x) return;Rotate(x->fa);x->pushdown();}
inline int getpos(node *x){
Rotate(x);r int res=Size(x->ls)+;
while (x->fa!=NULL){
if (x->fa->rs==x) res+=Size(x->fa->ls)+;x=x->fa;
}return res;
}
inline int Get_Ans(int k){
r int ord=getpos(pos[k]);
Droot x=split(root,ord);
Droot y=split(x.a,k-);
y.b->rev^=;root=merge(merge(y.a,y.b),x.b);
return ord;
}
}using namespace Treap;
struct things{
int ord,val;
inline bool operator <(const things &b)const{
return val<b.val||(val==b.val&&ord<b.ord);
}
}a[MN];int n,val[MN],rnk[MN];
void init(){
n=in();
for (int i=; i<=n; ++i) val[i]=in(),a[i].ord=i,a[i].val=val[i];
std::sort(a+,a+n+);for (r int i=; i<=n; ++i) rnk[a[i].ord]=i;
for (r int i=; i<=n; ++i){
pos[rnk[i]]=new node(val[i]);
root=merge(root,pos[rnk[i]]);
}
}
void solve(){for (r int i=; i<=n; ++i) printf("%d ",Get_Ans(i));}
int main(){init();solve();return ;}
【BZOJ3506】【Cqoi2014】排序机械臂的更多相关文章
- bzoj3506 [Cqoi2014]排序机械臂
bzoj3506 此题是一道比较简单的spaly题目. 用splay维护序列,将每个点排到对应的位置之后删除,这样比较容易区间翻转. 我的指针写法在洛谷上AC了,但在bzoj上RE. #include ...
- BZOJ1552[Cerc2007]robotic sort&BZOJ3506[Cqoi2014]排序机械臂——非旋转treap
题目描述 输入 输入共两行,第一行为一个整数N,N表示物品的个数,1<=N<=100000. 第二行为N个用空格隔开的正整数,表示N个物品最初排列的编号. 输出 输出共一行,N个用空格隔开 ...
- [BZOJ3506] [Cqoi2014] 排序机械臂 (splay)
Description 同OJ1552 Input Output Sample Input Sample Output HINT Source Solution Q:哎不是同一道题吗为什么分两篇博客来 ...
- [bzoj1552][Cerc2007]robotic sort&&[bzoj3506][Cqoi2014]排序机械臂
非常垃圾的一道平衡树,结果被日了一天.很难受嗷嗷嗷 首先不得不说网上的题解让我这个本来就不熟悉平衡树的彩笔很难受——并不好理解. 还好Sinogi大佬非常的神,一眼就切掉了,而且用更加美妙的解法. 题 ...
- 【BZOJ3506】[CQOI2014] 排序机械臂(Splay)
点此看题面 大致题意: 给你\(n\)个数.第一次找到最小值所在位置\(P_1\),翻转\([1,P_1]\),第二次找到剩余数中最小值所在位置\(P_2\),翻转\([2,P_2]\),以此类推.求 ...
- 【BZOJ3506】排序机械臂(Splay)
[BZOJ3506]排序机械臂(Splay) 题面 神TMBZOJ没有题面,感谢SYC的题面 洛谷的题面也不错 题解 对于每次旋转的物体 显然可以预处理出来 现在只要模拟旋转操作就行了 至于在哪里放标 ...
- P3165 [CQOI2014]排序机械臂
题目描述 为了把工厂中高低不等的物品按从低到高排好序,工程师发明了一种排序机械臂.它遵循一个简单的排序规则,第一次操作找到高度最低的物品的位置 P1P_1P1 ,并把左起第一个物品至 P1P_1P1 ...
- 洛谷P3165 [CQOI2014]排序机械臂
题目描述 为了把工厂中高低不等的物品按从低到高排好序,工程师发明了一种排序机械臂.它遵循一个简单的排序规则,第一次操作找到摄低的物品的位置P1,并把左起第一个至P1间的物品反序:第二次找到第二低的物品 ...
- BZOJ3506/1502 [CQOI2014]排序机械臂
传送门 依然是一道splay的区间操作,需要注意的是要把下标离散化后来表示splay的节点,我不知道怎么搞所以索性弄了个$ValuetoNode$,看样子没什么问题, 感觉他那个传下标的方法太暴力了. ...
- Luogu P3165 [CQOI2014]排序机械臂
先讲一下和这题一起四倍经验的题: Luogu P4402 [Cerc2007]robotic sort 机械排序 SP2059 CERC07S - Robotic Sort UVA1402 Robot ...
随机推荐
- 个人作业2:QQ音乐APP案例分析
APP案例分析 QQ音乐 选择理由:毕竟作为QQ音乐九年的资深老用户以及音乐爱好者 第一部分 调研 1.第一次上手的体验 我算是很早期的QQ音乐的用户,用QQ音乐七八年,除了体验各方面还不错之外 ...
- Cocoapods最全完整使用教程
什么是cocoapods cocoapods是库管理工具. cocoapods的用途 解决库之间的依赖关系.如前文所述: 一个开源的项目可能是另一个项目的基础, A依赖B, B依赖C和D, D又依赖E ...
- Django 视图层
URL映射 1.分布式url映射 include()函数提供分布式url映射功能,使URL映射可以被编写在多个url.py文件中 from django.conf.urls import url fr ...
- IDEA之Jrebel插件激活
问题: 码农日常中,热部署是必不可少的,而jrebel插件很好的实现热部署功能. IDEA下载jrebel插件,可以免费试用15天,但之后就无法使用.因为Jrebel是收费的. 解决方法: 楼主也是百 ...
- nyoj 寻找最大数(二)
寻找最大数(二) 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描述 给你一个数字n(可能有前缀0). 要求从高位到低位,进行 进栈出栈 操作,是最后输出的结果最大. ...
- python之路--day10-闭包函数
1.命名关键字参数 格式:在*后面的参数都是命名关键字参数 特点: 1.必须被传值 2.约束函数的调用者必须按照key=value的形式传值 3.约束函数的调用者必须用我们指定的key名 def au ...
- 在bootstrap中让竖向排列的输入框水平排列
在bootstrap中可以使用自带的样式标记来控制样式,但是同时可以利用最原始的css样式来解决达到需求 如下所示可以看出来两个inline-block就可以使得两个水平排列 block和inline ...
- github提交代码到服务器的方法
第一种情况,没有冲突:1.git add .//进入到center的项目下将本地文件打包的意思2.git pull origin dev//将服务器的代码下载到本地如果是最新的会提示Already u ...
- python识别验证码——PIL,pytesser,pytesseract的安装
1.使用Python识别验证码需要安装Python的图像处理模块(PIL.pytesser.pytesseract) (安装过程需要pip,在我的Python中已经安装pip了,pip的安装就不在赘述 ...
- angular2 学习笔记 ( 状态管理 state management )
更新 : 2017-12-29 ng5 移除 zone.js https://zhuanlan.zhihu.com/p/29577461 zone 的用途就是拦截游览器事件, 比如 click, a ...