Robotic Sort

Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3456    Accepted Submission(s): 1493

Problem Description
  Somewhere
deep in the Czech Technical University buildings, there are
laboratories for examining mechanical and electrical properties of
various materials. In one of yesterday’s presentations, you have seen
how was one of the laboratories changed into a new multimedia lab. But
there are still others, serving to their original purposes.

  In
this task, you are to write software for a robot that handles samples in
such a laboratory. Imagine there are material samples lined up on a
running belt. The samples have different heights, which may cause
troubles to the next processing unit. To eliminate such troubles, we
need to sort the samples by their height into the ascending order.

  Reordering
is done by a mechanical robot arm, which is able to pick up any number
of consecutive samples and turn them round, such that their mutual order
is reversed. In other words, one robot operation can reverse the order
of samples on positions between A and B.

  A possible way to sort
the samples is to find the position of the smallest one (P1) and reverse
the order between positions 1 and P1, which causes the smallest sample
to become first. Then we find the second one on position P and reverse
the order between 2 and P2. Then the third sample is located etc.

  The
picture shows a simple example of 6 samples. The smallest one is on the
4th position, therefore, the robot arm reverses the first 4 samples.
The second smallest sample is the last one, so the next robot operation
will reverse the order of five samples on positions 2–6. The third step
will be to reverse the samples 3–4, etc.

  Your task is to find
the correct sequence of reversal operations that will sort the samples
using the above algorithm. If there are more samples with the same
height, their mutual order must be preserved: the one that was given
first in the initial order must be placed before the others in the final
order too.

 
Input
  The
input consists of several scenarios. Each scenario is described by two
lines. The first line contains one integer number N , the number of
samples, 1 ≤ N ≤ 100 000. The second line lists exactly N
space-separated positive integers, they specify the heights of
individual samples and their initial order.

The last scenario is followed by a line containing zero.

 
Output
  For each scenario, output one line with exactly N integers P1 , P1 , . . . PN ,separated by a space.
Each Pi must be an integer (1 ≤ Pi ≤ N ) giving the position of the i-th sample just before the i-th reversal operation.

  Note
that if a sample is already on its correct position Pi , you should
output the number Pi anyway, indicating that the “interval between Pi
and Pi ” (a single sample) should be reversed.

 
Sample Input
  6
3 4 5 1 6 2
4
3 3 2 1
0
 
Sample Output
  4 6 4 5 6 6
4 2 4 4
 
  这道题很简单,注意Push_down就好了。
 #include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int maxn=;
int n,fa[maxn],ch[maxn][],sz[maxn];
int flip[maxn],pos[maxn],rt;
struct Node{
int x,id;
}a[maxn]; void Flip(int x){
swap(ch[x][],ch[x][]);
flip[x]^=;
} void Push_down(int x){
if(flip[x]){
Flip(ch[x][]);
Flip(ch[x][]);
flip[x]=;
}
} int pd[maxn];
void P(int x){
int cnt=;
while(x){
pd[++cnt]=x;
x=fa[x];
}
while(cnt){
Push_down(pd[cnt--]);
}
} void Push_up(int x){
sz[x]=sz[ch[x][]]+sz[ch[x][]]+;
} void Rotate(int x){
int y=fa[x],g=fa[y],c=ch[y][]==x;
ch[y][c]=ch[x][c^];fa[ch[x][c^]]=y;
ch[x][c^]=y;fa[y]=x;fa[x]=g;
if(g)ch[g][ch[g][]==y]=x;
Push_up(y);
} void Splay(int x,int g=){
P(x);
for(int y;(y=fa[x])!=g;Rotate(x))
if(fa[y]!=g)
Rotate((ch[fa[y]][]==y)==(ch[y][]==x)?y:x);
Push_up(x);
if(!g)rt=x;
} int Build(int f,int l,int r){
if(l>r)return ;
int mid=(l+r)>>;fa[mid]=f;
ch[mid][]=Build(mid,l,mid-);
ch[mid][]=Build(mid,mid+,r);
sz[mid]=;
Push_up(mid);
return mid;
} bool cmp(Node a,Node b){
if(a.x!=b.x)
return a.x<b.x;
return a.id<b.id;
} int main(){
while(~scanf("%d",&n)&&n){
memset(flip,,sizeof(flip));
rt=Build(,,n+);
for(int i=;i<=n;i++)
scanf("%d",&a[i].x);
for(int i=;i<=n;i++)
a[i].id=i;
sort(a+,a+n+,cmp);
for(int i=;i<=n;i++)
pos[i+]=a[i].id+;
pos[]=;pos[n+]=n+;
for(int i=,p;i<n+;i++){
Splay(pos[]);
Splay(pos[i],pos[]);
printf("%d ",sz[ch[ch[rt][]][]]+);
Splay(pos[i]);
p=ch[pos[i]][];
while(ch[p][]){
Push_down(p);
p=ch[p][];
}
Push_down(p);
Splay(pos[i-]);
Splay(p,pos[i-]);
Flip(ch[ch[rt][]][]);
}
printf("%d\n",n);
}
return ;
}
 

数据结构(Splay平衡树):HDU 1890 Robotic Sort的更多相关文章

  1. hdu 1890 Robotic Sort(splay 区间反转+删点)

    题目链接:hdu 1890 Robotic Sort 题意: 给你n个数,每次找到第i小的数的位置,然后输出这个位置,然后将这个位置前面的数翻转一下,然后删除这个数,这样执行n次. 题解: 典型的sp ...

  2. HDU 1890 Robotic Sort | Splay

    Robotic Sort Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) [Pr ...

  3. HDU 1890 Robotic Sort (splay tree)

    Robotic Sort Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

  4. HDU 1890 Robotic Sort(splay)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=1890 [题意] 给定一个序列,每次将i..P[i]反转,然后输出P[i],P[i]定义为当前数字i ...

  5. HDU 1890 - Robotic Sort - [splay][区间反转+删除根节点]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1890 Time Limit: 6000/2000 MS (Java/Others) Memory Li ...

  6. hdu 1890 Robotic Sort

    原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1890 如下: #include<cstdio> #include<cstdlib&g ...

  7. hdu 1890 Robotic SortI(splay区间旋转操作)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1890 题解:splay又一高级的功能,区间旋转这个是用线段树这些实现不了的,这题可以学习splay的旋 ...

  8. 【HDOJ】1890 Robotic Sort

    伸展树伤不起啊,很容易wa,很容易T,很容易M. /* 1890 */ #include <iostream> #include <string> #include <m ...

  9. 数据结构(Splay平衡树):COGS 339. [NOI2005] 维护数列

    339. [NOI2005] 维护数列 时间限制:3 s   内存限制:256 MB [问题描述] 请写一个程序,要求维护一个数列,支持以下 6 种操作:(请注意,格式栏 中的下划线‘ _ ’表示实际 ...

随机推荐

  1. oracle实现自动记录存储过程、自定义函数执行错误

    CREATE OR REPLACE Package Pkg_Stm_Prgerrlog As --Purpose: 实现记录系统错误异常信息,便于问题跟踪 Procedure Sp_Stm_Prger ...

  2. 10.30 afternoon

    P76竞赛时间: ????年??月??日??:??-??:?? 题目名称 他 她 它 名称 he she it 输入 he.in she.in it.in 输出 he.out she.out it.o ...

  3. SpringSecurity 在MVC 中的简单使用(翻译的,稍加改动)

    Spring Security允许开发人员轻松地将安全功能集成到J2EE Web应用程序中,它通过Servlet过滤器实现“用户自定义”安全检查. 在本教程中,我们将向您展示如何在Spring MVC ...

  4. maven jetty运行命令

    1.先运行build.xml <?xml version="1.0" encoding="UTF-8"?> <project name=&qu ...

  5. CSS3新增Hsl、Hsla、Rgba色彩模式以及透明属性(转)

    CSS2中色彩模式只有RGB色彩模式(RGB即RED.Green.BLue)和十六进制(Hex)模式,为了能支持 透明opacity 的Alpha值,CSS3又增加了RGBA色彩模式(RGBA即RED ...

  6. Simple screenshot that explains the non-static invocation.

    Here is the code: /* Instance invocation in the memory: */ package kju.obj; import static kju.print. ...

  7. GoogleAuthenticator

    <?php /** * PHP Class for handling Google Authenticator 2-factor authentication * * @author Micha ...

  8. JavaScript Boolean(布尔) 对象

    创建 Boolean 对象 Boolean 对象代表两个值:"true" 或者 "false" 下面的代码定义了一个名为 myBoolean 的布尔对象: va ...

  9. Java反射学习(java reflect)(二)

    ok之前说了Java的反射和反射分析类,那这些东西有神马作用呢,下面就来说应用: 三.运行时使用反射分析对象 简单写一个Employee类,然后利用JAVA反射去取name域,getDeclareFi ...

  10. 确认(confirm 消息对话框)

    confirm 消息对话框通常用于允许用户做选择的动作(包括一个确定按钮和一个取消按钮). 语法: confirm(str) str:在消息对话框中要显示的文本 返回值: 当用户点击"确定& ...