bzoj 1552: [Cerc2007]robotic sort
1552: [Cerc2007]robotic sort
Time Limit: 5 Sec Memory Limit: 64 MB
Submit: 1198 Solved: 457
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
3 4 5 1 6 2
Sample Output
HINT
Source
#include<cstdio>
#include<algorithm>
using namespace std;
#define INF 0x7fffffff
int n;
const int maxn = ;
struct Data{
int a,pos;
bool operator < (const Data & q)const {
if(q.a==a)return pos<q.pos;
else return a<q.a;
}
}l[maxn];
int mn[maxn],size[maxn],root,data[maxn],ch[maxn][],mnpos[maxn];
int rev[maxn],fa[maxn];
inline void pushdown(int x)
{
rev[x]=;
rev[ch[x][]]^=;
rev[ch[x][]]^=;
swap(ch[ch[x][]][],ch[ch[x][]][]);
swap(ch[ch[x][]][],ch[ch[x][]][]);
}
inline void pushup(int x)
{
mn[x]=min(data[x],min(mn[ch[x][]],mn[ch[x][]]));
if(mn[x]==data[x])mnpos[x]=x;
else if(mn[x]==mn[ch[x][]])mnpos[x]=mnpos[ch[x][]];
else mnpos[x]=mnpos[ch[x][]];
size[x]=size[ch[x][]]+size[ch[x][]]+;
}
inline int getkth(int k,int rt)
{
if(rev[rt])pushdown(rt);
if(k==size[ch[rt][]]+)return rt;
if(k<size[ch[rt][]]+)return getkth(k,ch[rt][]);
else getkth(k-size[ch[rt][]]-,ch[rt][]);
} inline int son(int x){
return ch[fa[x]][]==x;
}
void rotate(int x)
{
int y=fa[x],z=fa[y],b=son(x),c=son(y),a=ch[x][!b];
if(z)ch[z][c]=x;else root=x;fa[x]=z;
if(a)fa[a]=y;ch[y][b]=a;
ch[x][!b]=y;fa[y]=x;
pushup(y),pushup(x);
}
void splay(int &x,int i) {
while(fa[x]!=i)
{
int y=fa[x],z=fa[y];
if(z==i){
rotate(x);
}else {
if(rev[z])pushdown(z);if(rev[y])pushdown(y);if(rev[x])pushdown(x);
if(son(x)==son(y)) {
rotate(y),rotate(x);
}
else {
rotate(x);rotate(x);
}
}
}
}
int getmnpos(int l,int r)
{
int ll=getkth(l-,root);
int rr=getkth(r+,root);
splay(ll,);
splay(rr,ll);
return mnpos[ch[rr][]];
}
inline void reverse(int l,int r)
{
int ll=getkth(l-,root),rr=getkth(r+,root),p;
splay(ll,);splay(rr,ll);
p=ch[rr][];rev[p]^=;
swap(ch[p][],ch[p][]);
}
int main() {
scanf("%d",&n);
for(int i=;i<=n+;i++) scanf("%d",&l[i].a),l[i].pos=i;
sort(l+,l+n+);
for(int i=;i<=n+;i++)data[l[i].pos]=i;
for(int i=;i<=n+;i++)mn[i]=INF;
data[]=data[]=data[n+]=INF;root=;
for(int i=;i<=n+;i++) {
fa[i]=i-;
ch[i][]=i+;
}
ch[n+][]=;
for(int i=n+;i>=;i--) {
pushup(i);
}
for(int i=;i<=n;i++)
{
int po=getmnpos(i+,n+);
splay(po,);
printf("%d",size[ch[po][]]);
reverse(i+,size[ch[po][]]+);
if(i!=n)printf(" ");
}
return ;
}
bzoj 1552: [Cerc2007]robotic sort的更多相关文章
- BZOJ 1552: [Cerc2007]robotic sort( splay )
kpm大神说可以用块状链表写...但是我不会...写了个splay.... 先离散化 , 然后splay结点加个min维护最小值 , 就可以了... ( ps BZOJ 3506 题意一样 , 双倍经 ...
- 1552: [Cerc2007]robotic sort
这道题用splay写 先离散化数据保证按题目所述顺序来写 按原序作为键值建树 维护区间最小值去跑 每次将i的位置 和 n的位置x和y找出来后 将x旋转到root y旋转到x的有儿子 这时y的左子树就是 ...
- [BZOJ1552][Cerc2007]robotic sort
[BZOJ1552][Cerc2007]robotic sort 试题描述 输入 输入共两行,第一行为一个整数N,N表示物品的个数,1<=N<=100000.第二行为N个用空格隔开的正整数 ...
- 【BZOJ1552】[Cerc2007]robotic sort Splay
[BZOJ1552][Cerc2007]robotic sort Description Input 输入共两行,第一行为一个整数N,N表示物品的个数,1<=N<=100000.第二行为N ...
- 【bzoj1552/3506】[Cerc2007]robotic sort splay翻转,区间最值
[bzoj1552/3506][Cerc2007]robotic sort Description Input 输入共两行,第一行为一个整数N,N表示物品的个数,1<=N<=100000. ...
- [Cerc2007]robotic sort
splay区间反转练手题 #include <iostream> #include <cstdio> #include <algorithm> using name ...
- 洛谷 P4402 BZOJ1552 / 3506 [Cerc2007]robotic sort 机械排序
FHQ_Treap 太神辣 蒟蒻初学FHQ_Treap,于是来到了这道略显板子的题目 因为Treap既满足BST的性质,又满足Heap的性质,所以,对于这道题目,我们可以将以往随机出的额外权值转化为每 ...
- BZOJ 1552/1506 [Cerc2007]robotic sort
AC通道:http://www.lydsy.com/JudgeOnline/problem.php?id=1552 [分析] 这题哇!又有翻转操作...每次要输出第几个?是吧... 所以又要用Spla ...
- 【BZOJ】1552/3506 [Cerc2007]robotic sort
[算法]splay [题解] splay维护序列,用权值(离散化)作为编号.每次找第i小的话直接找对应编号splay即可. 但是这样splay没有下传翻转标记?直接暴力找到路径然后从根到改结点push ...
随机推荐
- Form和ModelForm组件
Form介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否 ...
- 用decimal模块增加python的浮点数精度
浮点数python默认是17位精度,也就是小数点后16位(16位以后的全部四舍五入了),虽然有16位,但是这个精度越往后越不准. 如果有特殊需求,需要更多的精度,可以用decimal模块,通过更改其里 ...
- 【HIHOCODER 1176】 欧拉路·一
描述 小Hi和小Ho最近在玩一个解密类的游戏,他们需要控制角色在一片原始丛林里面探险,收集道具,并找到最后的宝藏.现在他们控制的角色来到了一个很大的湖边.湖上有N个小岛(编号1..N),以及连接小岛的 ...
- 字符串:HDU5371-Hotaru's problem(manacher 的应用)
Hotaru's problem Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Pr ...
- redis--py链接redis【转】
请给原作者点赞--> 原文链接 一.redis redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链 ...
- selenium2截图ScreenShot的使用
截图是做测试的基本技能,在有BUG的地方,截个图,保留失败的证据,也方便去重现BUG.所以,在自动化的过程中,也要能截图,也要能在我们想要截取的地方去截图,且能在错误产生时,自动的截图. 示例: 脚本 ...
- python multiprocessing 源码分析
1. 文档是最先需要了解的,读完文档可能会有很多的意外的收获同时也会留下疑惑,对于一般的使用我觉得读完文档就差不多了,除非一些很有疑惑的地方你可能需要再深入的了解一下.我读文档的目的第一个就是为了找出 ...
- 文件上传下载,命令之wget / curl / which / sort / uniq / cut / wc /tr /sed
目录 命令 1.文件的上传下载 2.从外网下载文件wget 3.curl文件下载 4.查找命令which 5.字符处理命令-排序sort 6.字符处理-去重uniq 7.字符处理-截取cut 8.字符 ...
- [转] sublime插件
Sublime Text 系列 Sublime Text:学习资源篇 Sublime插件:增强篇 Sublime插件:Markdown篇 Sublime插件:C语言篇 Sublime插件:主题篇 Su ...
- Linux中TTY是什么意思
终端是一种字符型设备,它有多种类型,通常使用tty来简称各种类型的终端设备.tty是Teletype的缩写.Teletype是最早出现的一种终端 设备,很象电传打字机(或者说就是),是由Telety ...