1552: [Cerc2007]robotic sort

Time Limit: 5 Sec  Memory Limit: 64 MB
Submit: 1198  Solved: 457
[Submit][Status][Discuss]

Description

Input

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

Output

输出共一行,N个用空格隔开的正整数P1,P2,P3…Pn,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

HINT

 

Source

splay区间反转
#include<cstdio>
#include<algorithm>
using namespace std;
#define INF 0x7fffffff
int n;
const int maxn = ;
struct Data{
int a,pos;
bool operator < (const Data & q)const {
if(q.a==a)return pos<q.pos;
else return a<q.a;
}
}l[maxn];
int mn[maxn],size[maxn],root,data[maxn],ch[maxn][],mnpos[maxn];
int rev[maxn],fa[maxn];
inline void pushdown(int x)
{
rev[x]=;
rev[ch[x][]]^=;
rev[ch[x][]]^=;
swap(ch[ch[x][]][],ch[ch[x][]][]);
swap(ch[ch[x][]][],ch[ch[x][]][]);
}
inline void pushup(int x)
{
mn[x]=min(data[x],min(mn[ch[x][]],mn[ch[x][]]));
if(mn[x]==data[x])mnpos[x]=x;
else if(mn[x]==mn[ch[x][]])mnpos[x]=mnpos[ch[x][]];
else mnpos[x]=mnpos[ch[x][]];
size[x]=size[ch[x][]]+size[ch[x][]]+;
}
inline int getkth(int k,int rt)
{
if(rev[rt])pushdown(rt);
if(k==size[ch[rt][]]+)return rt;
if(k<size[ch[rt][]]+)return getkth(k,ch[rt][]);
else getkth(k-size[ch[rt][]]-,ch[rt][]);
} inline int son(int x){
return ch[fa[x]][]==x;
}
void rotate(int x)
{
int y=fa[x],z=fa[y],b=son(x),c=son(y),a=ch[x][!b];
if(z)ch[z][c]=x;else root=x;fa[x]=z;
if(a)fa[a]=y;ch[y][b]=a;
ch[x][!b]=y;fa[y]=x;
pushup(y),pushup(x);
}
void splay(int &x,int i) {
while(fa[x]!=i)
{
int y=fa[x],z=fa[y];
if(z==i){
rotate(x);
}else {
if(rev[z])pushdown(z);if(rev[y])pushdown(y);if(rev[x])pushdown(x);
if(son(x)==son(y)) {
rotate(y),rotate(x);
}
else {
rotate(x);rotate(x);
}
}
}
}
int getmnpos(int l,int r)
{
int ll=getkth(l-,root);
int rr=getkth(r+,root);
splay(ll,);
splay(rr,ll);
return mnpos[ch[rr][]];
}
inline void reverse(int l,int r)
{
int ll=getkth(l-,root),rr=getkth(r+,root),p;
splay(ll,);splay(rr,ll);
p=ch[rr][];rev[p]^=;
swap(ch[p][],ch[p][]);
}
int main() {
scanf("%d",&n);
for(int i=;i<=n+;i++) scanf("%d",&l[i].a),l[i].pos=i;
sort(l+,l+n+);
for(int i=;i<=n+;i++)data[l[i].pos]=i;
for(int i=;i<=n+;i++)mn[i]=INF;
data[]=data[]=data[n+]=INF;root=;
for(int i=;i<=n+;i++) {
fa[i]=i-;
ch[i][]=i+;
}
ch[n+][]=;
for(int i=n+;i>=;i--) {
pushup(i);
}
for(int i=;i<=n;i++)
{
int po=getmnpos(i+,n+);
splay(po,);
printf("%d",size[ch[po][]]);
reverse(i+,size[ch[po][]]+);
if(i!=n)printf(" ");
}
return ;
}

bzoj 1552: [Cerc2007]robotic sort的更多相关文章

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

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

  2. 1552: [Cerc2007]robotic sort

    这道题用splay写 先离散化数据保证按题目所述顺序来写 按原序作为键值建树 维护区间最小值去跑 每次将i的位置 和 n的位置x和y找出来后 将x旋转到root y旋转到x的有儿子 这时y的左子树就是 ...

  3. [BZOJ1552][Cerc2007]robotic sort

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

  4. 【BZOJ1552】[Cerc2007]robotic sort Splay

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

  5. 【bzoj1552/3506】[Cerc2007]robotic sort splay翻转,区间最值

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

  6. [Cerc2007]robotic sort

    splay区间反转练手题 #include <iostream> #include <cstdio> #include <algorithm> using name ...

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

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

  8. BZOJ 1552/1506 [Cerc2007]robotic sort

    AC通道:http://www.lydsy.com/JudgeOnline/problem.php?id=1552 [分析] 这题哇!又有翻转操作...每次要输出第几个?是吧... 所以又要用Spla ...

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

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

随机推荐

  1. leepcode作业解析-5-21

    25.Nim游戏 你和你的朋友,两个人一起玩 Nim 游戏:桌子上有一堆石头,每次你们轮流拿掉 1 - 3 块石头. 拿掉最后一块石头的人就是获胜者.你作为先手. 你们是聪明人,每一步都是最优解. 编 ...

  2. Altium Designer入门学习笔记1.软件安装与资料收集

    一.软件安装 微信:http://url.cn/5Eudzt9 关注微信公众号"软件安装管家",点击"软件目录",弹出"软件目录",点击进入 ...

  3. stm32之ADC应用实例(单通道、多通道、基于DMA)

    文本仅做记录.. 硬件:STM32F103VCT6 开发工具:Keil uVision4 下载调试工具:ARM仿真器 网上资料很多,这里做一个详细的整合.(也不是很详细,但很通俗).  所用的芯片内嵌 ...

  4. 使用IAR在开发nordic问题记录

    使用IAR在开发nordic的sdk的时候,官方有一段话*****Note for IAR 8 users:(Libraries for IAR 8 require wchar_t to be of ...

  5. 实践自己的WebSite______流水

    尝试从头至尾搭建一个MVC的网站,主要以流水的方式进行进度和记录,而不讨论技术的部分. 1,在Controller下创建两个文件夹,分别为sys和Business,分别对应于系统功能和业务逻辑.比如登 ...

  6. Python序列化、date、random、os模块

    知识点一:序列化与反序列化(json和pickple) 01 什么是序列化/反序列化    序列化就是将内存中的数据结构转换成一种中间格式存储到硬盘或者基于网络传输    发序列化就是硬盘中或者网络中 ...

  7. C#拆箱和装箱成本

    从原理上可以看出,装箱时,生成的是全新的引用对象,这会有时间损耗,也就是造成效率降低. 文章:.Net常见面试题整理(2)——装箱和拆箱 装箱,产生新的引用对象,并且赋值,然后引用. 拆箱,往往跟随着 ...

  8. manacher-模板-hd-3068

    /* 题意:给一个字符串,求该串的最长回文串的长度: 算法:Manacher O(n)复杂度,求以每一个字符为中心的最长汇文串的长度: 这个算法把奇数和偶数的情况和在一起来考虑了: */ #inclu ...

  9. JStorm源代码阅读——消息的确认机制

    Acker //Acker相当于一个bolt,用于处理事件 public class Acker implements IBolt { private RotatingMap<Object, A ...

  10. co模块总结

    1.thunk函数 javascript中的thunk函数就是一个单参数函数,且该参数必须是一个callback函数,callback的签名必须为callback(err,args...); 所谓的t ...