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. Cheese Aizu - 0558 (搜索题)

    Time limit8000 ms Memory limit131072 kB チーズ () 問題 今年も JOI 町のチーズ工場がチーズの生産を始め,ねずみが巣から顔を出した.JOI 町は東西南北に ...

  2. 3224: Tyvj 1728 普通平衡树(新板子)

    3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 17048  Solved: 7429[Submit][St ...

  3. cf963b Destruction of a Tree

    越靠近叶子越优先删掉 #include <iostream> #include <vector> #include <cstdio> using namespace ...

  4. loj2012 「SCOI2016」背单词

    -- #include <algorithm> #include <iostream> #include <cstring> #include <cstdio ...

  5. foy: 轻量级的基于 nodejs 的通用 build 工具

    npm 的 scripts 下写的命令太多就很容易很乱,各种第三方轮子都只能解决一部分问题,总感觉不是很好用,想找个类似 make 的工具只能找到 jake, 可是 jake 的 API 太老,居然很 ...

  6. web安全测试---跨站点脚本测试

    1.1      跨站脚本测试 1.1.1        GET方式跨站脚本测试 编号 SEC_Web_XSS_01 测试用例名称 GET方式跨站脚本测试 测试目的 由于跨站脚本会导致会话被劫持.敏感 ...

  7. 大数据学习——scala数组

    package com import scala.collection.mutable.ArrayBuffer /** * Created by Administrator on 2019/4/8. ...

  8. javascript图片放大镜效果展示

    javascript图片放大镜效果展示 <!DOCTYPE html> <html> <head lang="en"> <meta cha ...

  9. python3 保存一个网页为html文件

    我使用的python版本为3.5.2. 最近租房子,恨透了中介,想绕过中介去租.结果发现豆瓣同城里有好多二房东,感觉人都还不错.但是豆瓣这里没有信息检索的功能,只能人工地看房子的地址,非常地不方便.所 ...

  10. iOS学习笔记39-ReactiveCocoa入门

    FRP,全称为Functional Reactive Programming,是一种响应变化的编程范式,最近几年比较火,大概的理解就像这样: 当a的值或者b的值发生变化时,c的值会自动响应a的值或b的 ...