【bzoj1552/3506】[Cerc2007]robotic sort

Description

Input

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

Output

输出共一行,N个用空格隔开的正整数P1,P2,P3…Pn,(1 < = Pi < = N),Pi表示第i次操作前第i小的物品所在的位置。 注意:如果第i次操作前,第i小的物品己经在正确的位置Pi上,我们将区间[Pi,Pi]反转(单个物品)。

Sample Input

6
3 4 5 1 6 2

Sample Output

4 6 4 5 6 6
 
题解:裸题
 #include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
#include<cstdio> #define inf 1000000007
#define N 100007
#define ls c[p][0]
#define rs c[p][1]
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(ch>''||ch<''){if (ch=='-') f=-;ch=getchar();}
while(ch<=''&&ch>=''){x=(x<<)+(x<<)+ch-'';ch=getchar();}
return x*f;
} int n,rt;
int a[N],rev[N],mi[N],flag[N],fa[N],sz[N],c[N][],val[N],s[N]; void update(int p)
{
sz[p]=sz[ls]+sz[rs]+;
mi[p]=val[p],flag[p]=p;
if ((mi[ls]<mi[p])||(mi[ls]==mi[p]&&flag[p]>flag[ls])) mi[p]=mi[ls],flag[p]=flag[ls];
if ((mi[rs]<mi[p])||(mi[rs]==mi[p]&&flag[p]>flag[rs])) mi[p]=mi[rs],flag[p]=flag[rs];
}
void pushdown(int p)
{
if (rev[p])
{
rev[p]^=,rev[ls]^=,rev[rs]^=;
swap(c[p][],c[p][]);
}
}
void build(int l,int r,int f)
{
if (l>r) return;
if (l==r)
{
val[l]=a[l],sz[l]=,fa[l]=f,mi[l]=a[l],flag[l]=l;
if (l<f) c[f][]=l;
else c[f][]=l;
return;
}
int mid=(l+r)>>;
build(l,mid-,mid),build(mid+,r,mid);
if (mid<f) c[f][]=mid;
else c[f][]=mid;
fa[mid]=f,val[mid]=a[mid],mi[mid]=a[mid],flag[mid]=mid;
update(mid);
}
void rotate(int x,int &k)
{
int y=fa[x],z=fa[y],l,r;
if (c[y][]==x) l=;else l=;r=l^;
if (y==k) k=x;//交换后x就等于y
else if (c[z][]==y) c[z][]=x;
else c[z][]=x;
fa[x]=z,fa[y]=x,fa[c[x][r]]=y;
c[y][l]=c[x][r],c[x][r]=y;
update(y),update(x);
}
void splay(int x,int &k)
{
int top=;s[++top]=x;
for(int i=x;fa[i];i=fa[i])
s[++top]=fa[i];
for(int i=top;i;i--)
if(rev[s[i]])pushdown(s[i]);
while(x!=k)
{
int y=fa[x],z=fa[y];
if (y!=k)
{
if (c[y][]==x^c[z][]==y) rotate(x,k);
else rotate(y,k);
}
rotate(x,k);
}
}
int find(int p,int num)
{
pushdown(p);
if (sz[ls]>=num) return find(ls,num);
else if (sz[ls]+==num) return p;
else return find(rs,num-sz[ls]-);
}
int query(int l,int r)
{
int x=find(rt,l),y=find(rt,r+);
splay(x,rt),splay(y,c[x][]);
int now=c[y][];
return flag[now];
}
void spin(int l,int r)
{
int x=find(rt,l),y=find(rt,r+);
splay(x,rt),splay(y,c[x][]);
int now=c[c[x][]][];
rev[now]^=;
}
int main()
{
freopen("fzy.in","r",stdin);
freopen("fzy.out","w",stdout); int n=read();
for (int i=;i<=n+;i++)
a[i]=read();
a[]=a[n+]=a[]=inf,mi[]=inf;
build(,n+,),rt=(+n+)>>;
for (int i=;i<=n;i++)
{
int wei=query(i,n);
splay(wei,rt);
if (i!=n) printf("%d ",sz[c[wei][]]);
else printf("%d",sz[c[wei][]]);
spin(i,sz[c[wei][]]);
}
}

【bzoj1552/3506】[Cerc2007]robotic sort splay翻转,区间最值的更多相关文章

  1. 【BZOJ1552】[Cerc2007]robotic sort Splay

    [BZOJ1552][Cerc2007]robotic sort Description Input 输入共两行,第一行为一个整数N,N表示物品的个数,1<=N<=100000.第二行为N ...

  2. 洛谷 P4402 BZOJ1552 / 3506 [Cerc2007]robotic sort 机械排序

    FHQ_Treap 太神辣 蒟蒻初学FHQ_Treap,于是来到了这道略显板子的题目 因为Treap既满足BST的性质,又满足Heap的性质,所以,对于这道题目,我们可以将以往随机出的额外权值转化为每 ...

  3. BZOJ1552/3506 [Cerc2007]robotic sort

    Splay 与之前不同的是如果你仅仅是翻转左右区间的话可以在find里面做因为对他有影响的子树在做之前一定在他的上面从上到下搜索的过程可以把rever做了. 但这道题要求我们输出转换之前的,因此不能保 ...

  4. 【BZOJ-1552&3506】robotic sort&排序机械臂 Splay

    1552: [Cerc2007]robotic sort Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 806  Solved: 329[Submit][ ...

  5. BZOJ 1552: [Cerc2007]robotic sort( splay )

    kpm大神说可以用块状链表写...但是我不会...写了个splay.... 先离散化 , 然后splay结点加个min维护最小值 , 就可以了... ( ps BZOJ 3506 题意一样 , 双倍经 ...

  6. [BZOJ1552] [Cerc2007] robotic sort (splay)

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

  7. 【bzoj1552】[Cerc2007]robotic sort

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

  8. 【BZOJ】1552/3506 [Cerc2007]robotic sort

    [算法]splay [题解] splay维护序列,用权值(离散化)作为编号.每次找第i小的话直接找对应编号splay即可. 但是这样splay没有下传翻转标记?直接暴力找到路径然后从根到改结点push ...

  9. [BZOJ1552][Cerc2007]robotic sort

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

随机推荐

  1. 贴图、纹理、材质的区别是什么? 还有shader

    贴图.纹理.材质的区别是什么? 还有shader 整个 CG 领域中这三个概念都是差不多的,在一般的实践中,大致上的层级关系是:材质 Material包含贴图 Map,贴图包含纹理 Texture.纹 ...

  2. laravel 配置站点域名

    访问一直报404错误 laravel端: default.conf server {        listen       80;        server_name  api.xxxx.com; ...

  3. P3374 【模板】树状数组 1 单点修改与区间查询

    题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某一个数加上x 2.求出某区间每一个数的和 输入输出格式 输入格式: 第一行包含两个整数N.M,分别表示该数列数字的个数和操作的总个数. ...

  4. 【学习笔记】深入理解js原型和闭包(8)——简述【执行上下文】上

    什么是“执行上下文”(也叫做“执行上下文环境”)?暂且不下定义,先看一段代码: 第一句报错,a未定义,很正常.第二句.第三句输出都是undefined,说明浏览器在执行console.log(a)时, ...

  5. ios app跳转拨打电话界面,调用拨打电话功能

    DNLogFUNC //两种方法都可以用 //这种据说是可以上appstore NSURL *phoneURL = [NSURL URLWithString:[NSString stringWithF ...

  6. Really simple SSH proxy (SOCKS5)

    原文: https://thomashunter.name/blog/really-simple-ssh-proxy-socks5/ SOCKS5 is a simple, eloquent meth ...

  7. javaee 第四周作业

    分析hello.java.下载链接:https://github.com/javaee/tutorial-examples/tree/master/web/jsf/hello1 /** * Copyr ...

  8. flask_SQLAlchemy 中常用的过滤和执行器

    常用的SQLAlchemy查询过滤器 过滤器 说明 filter() 把过滤器添加到原查询上,返回一个新查询 filter_by() 把等值过滤器添加到原查询上,返回一个新查询 limit 使用指定的 ...

  9. droplang - 删除一种 PostgreSQL 过程语言

    SYNOPSIS droplang [ connection-option...] langname [ dbname] droplang [ connection-option...] --list ...

  10. 关于sigleton模式

    单例模式的要点有三个:一是某个类只能有一个实例:二是它必须自行创建这个实例:三是它必须自行向整个系统提供这个实例. 从具体实现角度来说,就是以下三点:一是单例模式的类只提供私有的构造函数,二是类定义中 ...