HDU1890 Robotic Sort[splay 序列]
Robotic Sort
Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3913 Accepted Submission(s): 1717
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.
The last scenario is followed by a line containing zero.
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.
3 4 5 1 6 2
4
3 3 2 1
0
4 2 4 4
- //
- // main.cpp
- // hdu1890
- //
- // Created by Candy on 30/11/2016.
- // Copyright © 2016 Candy. All rights reserved.
- //
- #include <iostream>
- #include <cstdio>
- #include <cstring>
- #include <algorithm>
- #include <cmath>
- using namespace std;
- #define pa t[x].fa
- #define lc t[x].ch[0]
- #define rc t[x].ch[1]
- const int N=1e5+;
- inline int read(){
- char c=getchar();int x=,f=;
- while(c<''||c>''){if(c=='-')f=-;c=getchar();}
- while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
- return x*f;
- }
- struct node{
- int fa,ch[],w,size,flp;
- }t[N];
- int root;
- inline void update(int x){t[x].size=t[lc].size+t[rc].size+t[x].w;}
- inline int wh(int x){return t[pa].ch[]==x;}
- inline void pushDown(int x){
- if(t[x].flp){
- swap(lc,rc);
- t[lc].flp^=;t[rc].flp^=;
- t[x].flp=;
- }
- }
- inline void rotate(int x){
- int f=t[x].fa,g=t[f].fa,c=wh(x);
- if(g) t[g].ch[wh(f)]=x;t[x].fa=g;
- t[f].ch[c]=t[x].ch[c^];t[t[f].ch[c]].fa=f;
- t[x].ch[c^]=f;t[f].fa=x;
- update(f);update(x);
- }
- inline void splay(int x,int tar){
- for(;t[x].fa!=tar;rotate(x))
- if(t[pa].fa!=tar) rotate(wh(pa)==wh(x)?pa:x);
- if(tar==) root=x;
- }
- int ne[N];
- void spl(int x,int tar){
- int _=x;
- while(x!=tar) ne[pa]=x,x=pa;
- x=_;
- for(int i=tar;i!=x;i=ne[i]) pushDown(i);
- pushDown(x);
- splay(x,tar);
- }
- int build(int l,int r){
- if(l>r) return ;
- int x=(l+r)>>;
- lc=build(l,x-);rc=build(x+,r);
- t[lc].fa=t[rc].fa=x;
- t[x].w=;t[x].flp=;
- update(x);
- //printf("build %d %d %d\n",x,lc,rc);
- return x;
- }
- int kth(int k){
- int x=root,ls=;
- while(x!=){
- pushDown(x);
- int _=ls+t[lc].size;
- if(_<k&&k<=_+t[x].w) return x;
- if(k<=_) x=lc;
- else ls=_+t[x].w,x=rc;
- }
- return -;
- }
- void rever(int l,int r){//printf("rev %d %d ",l,r);
- splay(kth(l),);
- int x=kth(r+);//printf("x %d\n",x);
- splay(x,root);
- t[lc].flp^=;
- }
- int n;
- struct data{
- int id,v;
- bool operator <(const data &a)const{
- if(v==a.v) return id<a.id;
- return v<a.v;
- }
- }a[N];
- int main(int argc, const char * argv[]){
- while(scanf("%d",&n)!=EOF&&n){
- memset(t,,sizeof(t));
- for(int i=;i<=n;i++) a[i].v=read(),a[i].id=i+;
- sort(a+,a++n);
- root=build(,n+);
- for(int i=;i<=n;i++){
- int x=a[i].id;//printf("hi %d %d\n",i,x);
- spl(x,);
- printf("%d%c",t[lc].size,i<n?' ':'\n');
- rever(i,t[lc].size);
- }
- }
- return ;
- }
HDU1890 Robotic Sort[splay 序列]的更多相关文章
- hdu1890 Robotic Sort (splay+区间翻转单点更新)
Problem Description Somewhere deep in the Czech Technical University buildings, there are laboratori ...
- HDU1890 Robotic Sort Splay tree反转,删除
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1890 题目中涉及数的反转和删除操作,需要用Splay tree来实现.首先对数列排序,得到每个数在数列 ...
- HDU 1890 Robotic Sort | Splay
Robotic Sort Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) [Pr ...
- BZOJ 1552: [Cerc2007]robotic sort( splay )
kpm大神说可以用块状链表写...但是我不会...写了个splay.... 先离散化 , 然后splay结点加个min维护最小值 , 就可以了... ( ps BZOJ 3506 题意一样 , 双倍经 ...
- hdu 1890 Robotic Sort(splay 区间反转+删点)
题目链接:hdu 1890 Robotic Sort 题意: 给你n个数,每次找到第i小的数的位置,然后输出这个位置,然后将这个位置前面的数翻转一下,然后删除这个数,这样执行n次. 题解: 典型的sp ...
- 【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. ...
- [BZOJ1552] [Cerc2007] robotic sort (splay)
Description Input 输入共两行,第一行为一个整数N,N表示物品的个数,1<=N<=100000.第二行为N个用空格隔开的正整数,表示N个物品最初排列的编号. Output ...
- HDU 1890 - Robotic Sort - [splay][区间反转+删除根节点]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1890 Time Limit: 6000/2000 MS (Java/Others) Memory Li ...
随机推荐
- Entity Framework 数据库先行、模型先行、代码先行
数据库先行(Database First):基于已存在的数据库,利用某些工具(如Vs提供的EF设计器)创建实体类,数据库对象与实体类的匹配关系等,你也可以手动修改这些自动生成的代码及匹配文件. 模型先 ...
- bzoj1202--带权并查集+前缀和
http://www.lydsy.com/JudgeOnline/problem.php?id=1202 记s[i]=a[1]+a[2]+...+a[i],即s[i]为前缀和.再令v[i]=s[f[i ...
- 新建 ASP.NET Core Web API 项目 -- RESTFul 风格 Hello World!
一.创建一个空项目 请查看 新建 .NET Core 项目 -- Hello World! 一节,新建一个项目: 二.添加引用并修改配置为 Web API (.NET Core 已将 MVC/W ...
- 工行ATM转账——事务操作
今儿去工行ATM给已朋友转账,遇到这么个情况: 选择对外转账后输入转入账号(输入两次),接着提示输入转入金额(输入一次金额),按确定,系统提示交易中,3秒左右,提示“输入账号无效”,系统自动中断了操作 ...
- html5手机端遮罩弹出菜单代码
效果体验:http://hovertree.com/texiao/html5/17/ 效果图: 代码如下: <!doctype html> <html lang="zh&q ...
- javascript中concat方法深入理解
最近在恶补js知识的时候,总是会因为js强大的语法而感到震撼.因为以前对前端方面的疏忽,导致了一些理解的错误.因此痛改前非,下定决心,不管做什么事情,都要有专研的精神. 在介绍前,抛出一个问题:如何将 ...
- Struts2(1) —— 概述
1.Struts2框架介绍 Struts2框架是MVC流程框架,适合分层开发,框架应用实现不依赖于Servlet,使用大量的拦截器来处理用户请求,属于无侵入式的设计. 2.Struts2框架的流程原理 ...
- 天津政府应急系统之GIS一张图(arcgis api for flex)讲解(四)地图导航控件模块
config.xml文件的配置如下: <widget left="10" top="50" config="widgets/Navigation ...
- IOS开发基础知识--碎片45
1:iOS SEL的简单总结 SEL就是对方法的一种包装.包装的SEL类型数据它对应相应的方法地址,找到方法地址就可以调用方法 a.方法的存储位置 在内存中每个类的方法都存储在类对象中 每个方法都有一 ...
- Thrift-java学习小结
➠更多技术干货请戳:听云博客 Thrift是什么?什么情况下使用thrift Thrift源于大名鼎鼎的facebook之手,在2007年facebook提交Apache基金会将Thrift作为一个开 ...