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. windows下jboss启动、配置、访问

    window 下的jboss启动.配置.访问 1.进入jboss\server\default\deploy\jboss-web.deployer 执行run命令 2.jboss访问地址:http:/ ...

  2. Python_oldboy_自动化运维之路(一)

    python简介: Python 是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语言. Python 的设计具有很强的可读性,相比其他语言经常使用英文关键字,其他语言的一些标点符号,它具有 ...

  3. U3D 内置对象

    在U3D里面提供了一个Time对象: void OnGUI(){ Debug.Log("########################"); GUILayout.Label (& ...

  4. Chrome浏览器允许跨域请求配置

    最近有个做数据标注的任务,但是标注平台是别人公司的,他们又不愿意对平台进行升级改造: 其实要改的地方也很简单,就是对页面做一些处理,做一些脚本控制. 没办法,做了个 iframe 给她嵌入到我们自己的 ...

  5. tomcat的webapp下的root文件夹的作用是什么

    1.基本一样..只是表示不同的tomcat的http路径而已. root目录默认放的是tomcat自己的一个项目,如:http://localhost:8080/默认访问root项目 对于webapp ...

  6. IOS常用开源库

    转自:http://www.csdn.net/article/2013-06-18/2815806-GitHub-iOS-open-source-projects-two/1 1. AFNetwork ...

  7. NSDate,NSCalendar,NSTimer,NSTimeZone

      NSDate存储的是世界标准时(UTC),输出时需要根据时区转换为本地时间 Dates NSDate类提供了创建date,比较date以及计算两个date之间间隔的功能.Date对象是不可改变的. ...

  8. Objective-C和C++的区别

    1.都是有C语言延伸而来2.OC是完全动态的,C++是部分动态的3.OC不支持多继承,通过代理 类别 协议优雅的实现了相关的一系列特性4.调用机制不同OC里面叫发送消息  C++叫做调用函数数5.OC ...

  9. [转]mysql 导入导出数据库以及函数、存储过程的介绍

    本篇文章是对mysql中的导入导出数据库命令以及函数.存储过程进行了详细的分析介绍,需要的朋友参考下: mysql常用导出数据命令:1.mysql导出整个数据库  mysqldump -hhostna ...

  10. npm的镜像替换成淘宝

    1.得到原本的镜像地址 npm get registry > https://registry.npmjs.org/ 设成淘宝的 npm config set registry http://r ...