HDU 1890 区间反转
http://acm.hdu.edu.cn/showproblem.php?pid=1890
Robotic Sort
Problem Description
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.
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.
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.
0
#include"stdio.h"
#include"iostream"
#include"queue"
#include"string.h"
#include"map"
#include"stdlib.h"
#include"algorithm"
#include"string"
#define M 1000005
#define inf 0x3f3f3f3f
using namespace std;
int a[M];
struct P
{
int val,pri,key;
}p[M];
int top,root;
int cmp(P a,P b)
{
if(a.val==b.val)
return a.pri<b.pri;
return a.val<b.val;
}
int son[M][],fa[M],num[M],flip[M],child[M];
struct Text
{
queue<int>q;
void init(int n)
{
top=n+;
for(int i=;i<=n+;i++)
{
num[i]=;
son[i][]=son[i][]=-;
fa[i]=-;
flip[i]=;
}
}
void Rotate(int x,int k)
{
int y=fa[x]; son[y][^k]=son[x][k];
if(son[y][^k]!=-)
fa[son[y][^k]]=y;
push_up(y);
if(son[fa[y]][]==y)
son[fa[y]][]=x;
else
son[fa[y]][]=x;
fa[x]=fa[y]; son[x][k]=y;
fa[y]=x;
}
void splay(int x,int f)
{
if(x==-)return;
while(fa[x]!=f)
{
int y=fa[x];
int z=fa[y];
if(z==f)
{
if(son[y][]==x)
Rotate(x,);
else
Rotate(x,);
}
else
{
if(son[z][]==y)
{
if(son[y][]==x)
{
Rotate(y,);
Rotate(x,);
}
else
{
Rotate(x,);
Rotate(x,);
}
}
else
{
if(son[y][]==x)
{
Rotate(y,);
Rotate(x,);
}
else
{
Rotate(x,);
Rotate(x,);
}
}
}
}
if(f==top)
root=x;
}
void RotateTo(int k,int f)
{
k++;
int x=root;
while()
{
push_down(x);
int temp=getNum(son[x][])+;
if(k==temp)break;
else if(k<temp)
x=son[x][];
else
{
k-=temp;
x=son[x][];
}
}
splay(x,f);
push_up(x);
}
int getOrder(int x)
{
int y=x;
while(fa[y]!=top)
{
int f=fa[y];
child[f]=y;
y=fa[y];
}
y=root;
while(y!=x)
{
int z=child[y];
push_down(z);
y=child[y];
}
int k=getNum(son[x][])+;
while(fa[x]!=top)
{
int y=fa[x];
int temp=getNum(son[y][])+;
if(son[y][]==x)
x=fa[x];
else
{
k+=temp;
x=fa[x];
}
}
return k-;
}
void Reversal(int x)
{
if(x==-)return;
int y=son[x][];
son[x][]=son[x][];
son[x][]=y;
}
int getNum(int x)
{
if(x==-)return ;
return num[x];
}
void push_up(int x)
{
num[x]=getNum(son[x][])+getNum(son[x][])+;
}
void push_down(int x)
{
if(x==-)return;
if(flip[x])
{
flip[x]^=;
Reversal(x);
if(son[x][]!=-)
flip[son[x][]]^=;
if(son[x][]!=-)
flip[son[x][]]^=;
}
}
void creat(int l,int r,int k,int f)
{
if(l>r)return;
int mid=(l+r)/;
if(f==top)
root=mid;
son[f][k]=mid;
fa[mid]=f;
creat(l,mid-,,mid);
creat(mid+,r,,mid);
push_up(mid);
}
void dfs(int x,int n)
{
if(x==-)return;
push_down(x);
dfs(son[x][],n);
if(x>=&&x<=n)
q.push(a[x]);
dfs(son[x][],n);
}
void output(int n)
{
dfs(root,n);
printf("%d",q.front());
q.pop();
while(!q.empty())
{
printf(" %d",q.front());
q.pop();
}
puts("");
}
}; int main()
{
int n;
while(scanf("%d",&n),n)
{
Text text;
for(int i=;i<=n;i++)
scanf("%d",&a[i]);
map<int,int>mp;
p[].val=-inf;
p[].pri=;
p[].key=;
for(int i=;i<=n;i++)
{
p[i].val=a[i];
p[i].pri=mp[a[i]];
p[i].key=i;
mp[a[i]]++;
}
p[n+].val=inf;
p[n+].pri=;
p[n+].key=n+;
sort(p,p+n+,cmp);
text.init(n);
text.creat(,n+,,top);
for(int i=;i<=n;i++)
{
int l=i-;
int key=p[i].key;
int r=text.getOrder(key)+;
text.RotateTo(l,top);
text.RotateTo(r,root);
flip[son[son[root][]][]]^=;
//text.output(n);
if(i==)
printf("%d",r-);
else
printf(" %d",r-);
}
puts("");
}
return ;
}
HDU 1890 区间反转的更多相关文章
- hdu 1890 Robotic Sort(splay 区间反转+删点)
题目链接:hdu 1890 Robotic Sort 题意: 给你n个数,每次找到第i小的数的位置,然后输出这个位置,然后将这个位置前面的数翻转一下,然后删除这个数,这样执行n次. 题解: 典型的sp ...
- hdu1890 伸展树(区间反转)
对于大神来说这题是水题.我搞这题花了快2天. 伸展树的优点有什么,就是树不管你怎么旋转序列是不会改变得,并且你要使区间反转,只要把第k大的点转到根结点,那么它的左子树就是要交换的区间[l,r),然后交 ...
- 算法模板——splay区间反转 2
实现功能:同splay区间反转 1(基于BZOJ3223 文艺平衡树) 这次改用了一个全新的模板(HansBug:琢磨了我大半天啊有木有),大大简化了程序,同时对于splay的功能也有所完善 这里面没 ...
- 算法模板——splay区间反转 1
实现的功能:将序列区间反转,并维护 详见BZOJ3223 var i,j,k,l,m,n,head,a1,a2:longint; s1:ansistring; a,b,c,d,fat,lef,rig: ...
- hdu 5869 区间不同GCD个数(树状数组)
Different GCD Subarray Query Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K ( ...
- hdu 4283 区间dp
You Are the One Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
- hdu 5700区间交(线段树)
区间交 Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submiss ...
- HDU 2829 区间DP & 前缀和优化 & 四边形不等式优化
HDU 2829 区间DP & 前缀和优化 & 四边形不等式优化 n个节点n-1条线性边,炸掉M条边也就是分为m+1个区间 问你各个区间的总策略值最少的炸法 就题目本身而言,中规中矩的 ...
- 2018牛客网暑期ACM多校训练营(第三场) H - Shuffle Cards - [splay伸展树][区间移动][区间反转]
题目链接:https://www.nowcoder.com/acm/contest/141/C 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K ...
随机推荐
- physical addressing virtual addressing 物理寻址 虚拟寻址
Computer Systems A Programmer's Perspective Second Edition The main memory of a computer system is o ...
- Apache Kafka源码分析 - kafka controller
前面已经分析过kafka server的启动过程,以及server所能处理的所有的request,即KafkaApis 剩下的,其实关键就是controller,以及partition和replica ...
- SQLServer2008:助您轻松编写T-SQL存储过程(原创)【转】
本文主要介绍 SQLServerExpress2008不用第三方工具调试T-SQL语句,经过本文的介绍,用SQLSERVER2008 Manage studio 编写.调试T-SQL存储过程都将是 ...
- BLE GATT规范中关于UUID与属性的详细解析
1. 角色 除了GAP定义了角色之外,BLE还定义了另外2种角色:GATT服务器和GATT客户端,它们完全独立于GAP的角色.提供数据的设备称为GATT服务器,访问GATT服务器而获得数据的设备称为G ...
- Redis Sentinel高可用配置及C#访问
本文环境如下: 操作系统:ubuntu-14.04.1-desktop-amd64 Redis:2.8.19 如果使用虚拟机则将每台的网络设置为桥接,否则他们之间能连上,局域网连不上. 系统设计如图: ...
- MVC4怎么设置@Html.TextBoxFor这样的输入框的css样式
在传统webForm中,输入框的这样的: <input id="userName" name="userName" type="text&quo ...
- sql Server 使某一列的值等于行号
declare @i INT update 表名 SET [列名]=@i,@i=@i+ WHERE 条件
- Set Java Proxy for Http/Https
Command Line JVM Settings The proxy settings are given to the JVM via command line arguments: java ...
- C#反射代码
Object model=Assembly.Load(“程序集”).CreateInstance(命名空间.类名); object obj2 = Type.GetType("MyClass& ...
- OC 对象和匿名对象
OC 对象和匿名对象 对象和匿名对象的定义: 当new出一个对象时,如果用一个指针接收这个对象,那么这个指针通常被称为对象. 如果new出的对象,不用指针接收,那么这个对象就称为匿名对象. #impo ...