kpm大神说可以用块状链表写...但是我不会...写了个splay....

先离散化 , 然后splay结点加个min维护最小值 , 就可以了...

( ps BZOJ 3506 题意一样 , 双倍经验 )

-----------------------------------------------------------------------

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
 
#define rep( i , n ) for( int i = 0 ; i < n ; ++i )
#define clr( x , c ) memset( x , c , sizeof( x ) )
#define Rep( i , n ) for( int i = 1 ; i <= n ; ++i )
 
using namespace std;
 
const int maxn = 100000 + 5;
const int maxnode = 101000;
const int inf = 0x7fffffff;
 
int n;
 
struct data {
int v , pos;
bool operator < ( const data &rhs ) const {
return ( v < rhs.v ) || ( v == rhs.v && pos < rhs.pos );
}
};
 
bool cmp( const data &a , const data &b ) {
return a.pos < b.pos;
}
 
data A[ maxn ];
 
struct Node *pt , *null;
 
struct Node {
Node *ch[ 2 ] , *p;
int mn , val , size;
bool rev;
Node( int v = inf ) {
mn = val = v;
ch[ 0 ] = ch[ 1 ] = null;
rev = 0;
}
inline void setc( Node* c , int d ) {
ch[ d ] = c;
c -> p = this;
}
inline bool d() {
return this == p -> ch[ 1 ];
}
inline void Rev() {
rev ^= 1;
}
inline void upd() {
size = ch[ 0 ] -> size + ch[ 1 ] -> size + 1;
mn = min( val , min( ch[ 0 ] -> mn , ch[ 1 ] -> mn ) );
}
inline void relax() {
if( rev ) {
swap( ch[ 0 ] , ch[ 1 ] );
rep( i , 2 ) if( ch[ i ] != null )
   ch[ i ] -> Rev();
rev = 0;
}
}
void* operator new( size_t ) {
return pt++;
}
};
 
Node NODE[ maxnode ];
Node* root;
 
Node* build( int l , int r ) {
if( l >= r )
   return null;
int m = ( l + r ) >> 1;
Node* t = new Node( A[ m ].v );
t -> setc( build( l , m ) , 0 );
t -> setc( build( m + 1 , r ) , 1 );
t -> upd();
return t;
}
 
void rot( Node* t ) {
Node* p = t -> p;
p -> relax();
t -> relax();
int d = t -> d();
p -> p -> setc( t , p -> d() );
p -> setc( t -> ch[ ! d ] , d );
t -> setc( p , ! d );
p -> upd();
if( p == root ) root = t;
}
 
void splay( Node* t , Node* f = null ) {
while( t -> p != f ) {
if( t -> p -> p == f ) rot( t );
else if( t -> d() != t -> p -> d() ) rot( t ) , rot( t );
else rot( t -> p ) , rot( t );
}
t -> upd();
}
 
Node* select( int k ) {
for( Node* t = root ; ; ) {
t -> relax();
int s = t -> ch[ 0 ] -> size;
if( s == k ) return t;
else if( s < k ) {
k -= s + 1;
t = t -> ch[ 1 ];
} else 
   t = t -> ch[ 0 ];
}
}
 
int v;
Node* find( Node* t ) {
t -> relax();
if( t -> val == v ) return t;
else return find( t -> ch[ 0 ] -> mn != v ? t -> ch[ 1 ] : t -> ch[ 0 ] );
}
 
Node* &get( int l , int r ) {
l-- , r++;
Node* L = select( l );
Node* R = select( r );
splay( L );
splay( R , L );
return R -> ch[ 0 ];
}
 
void init() {
pt = NODE;
null = new( Node );
null -> size = 0;
root = build( 0 , n + 2 );
root -> p = null;
}
 
int main() {
freopen( "test.in" , "r" , stdin );
cin >> n;
Rep( i , n ) {
scanf( "%d" , &A[ i ].v );
A[ i ].pos = i;
}
sort( A + 1 , A + n + 1 );
Rep( i , n ) A[ i ].v = i;
sort( A + 1 , A + n + 1 , cmp );
A[ 0 ].v = A[ n + 1 ].v = inf;
init();
Rep( i , n ) {
v = i;
Node* &t = get( i , n );
Node* x = find( t );
splay( x );
int k = x -> ch[ 0 ] -> size;
printf( "%d" , k );
if( i != n ) printf( " " );
x = get( i , k );
x -> Rev();
splay( x );
}
return 0;
}

-----------------------------------------------------------------------

1552: [Cerc2007]robotic sort

Time Limit: 5 Sec  Memory Limit: 64 MB
Submit: 486  Solved: 203
[Submit][Status][Discuss]

Description

Input

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

Output

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

BZOJ 1552: [Cerc2007]robotic sort( splay )的更多相关文章

  1. bzoj 1552: [Cerc2007]robotic sort

    1552: [Cerc2007]robotic sort Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1198  Solved: 457[Submit] ...

  2. 【BZOJ1552】[Cerc2007]robotic sort Splay

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

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

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

  4. [BZOJ1552] [Cerc2007] robotic sort (splay)

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

  5. 1552: [Cerc2007]robotic sort

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

  6. [BZOJ1552][Cerc2007]robotic sort

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

  7. HDU1890 Robotic Sort[splay 序列]

    Robotic Sort Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

  8. hdu 1890 Robotic Sort(splay 区间反转+删点)

    题目链接:hdu 1890 Robotic Sort 题意: 给你n个数,每次找到第i小的数的位置,然后输出这个位置,然后将这个位置前面的数翻转一下,然后删除这个数,这样执行n次. 题解: 典型的sp ...

  9. HDU 1890 Robotic Sort | Splay

    Robotic Sort Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) [Pr ...

随机推荐

  1. A Byte of Python (1)安装和运行

    有两种方式构建软件设计:一种是把软件做得很简单以至于明显找不到缺陷:另一种是把它做得很复杂以至于找不到明显的缺陷. ——C.A.R. Hoare 获得人生中的成功需要的专注与坚持不懈多过天才与机会. ...

  2. HTML+CSS笔记 CSS进阶再续

    CSS的布局模型 清楚了CSS 盒模型的基本概念. 盒模型类型, 我们就可以深入探讨网页布局的基本模型了.布局模型与盒模型一样都是 CSS 最基本. 最核心的概念. 但布局模型是建立在盒模型基础之上, ...

  3. java时间验证工具

    可以验证2014-02-21这种错误

  4. 手动修改VisualStudio IISExpress的配置

    <VisualStudio> <FlavorProperties GUID="{349c5851-65df-11da-9384-00065b846f21}"> ...

  5. Qt实战之开发软件数据获取助手(eventFilter处理鼠标按下,event处理鼠标松开)

    前段时间,受朋友委托,需要做一个能够获取别人软件文本框中内容的助手.当然这需要调用win api来解决问题.一开始,我想都没想,就用getWindowText()....居然没用,好郁闷.于是查msd ...

  6. TreeView控件例子

    XmL文件代码: <?xml version="1.0" encoding="utf-8" ?> <Area> <Province ...

  7. 转:CI配置SMARTY

    1.到相应站点下载Smarty的源码包:2.将源码包里面的libs文件夹copy到CI的项目目录下面的libraries文件夹下,并重命名为Smarty:3.在目录 application/libra ...

  8. C++ 用libcurl库进行http 网络通讯编程

      一.LibCurl基本编程框架libcurl是一个跨平台的网络协议库,支持http, https, ftp, gopher, telnet, dict, file, 和ldap 协议.libcur ...

  9. HDU 1983 Kaitou Kid - The Phantom Thief (2)

    神题,搜索太差,来自网络的题解与程序 思路: 封锁出口或者入口周围的格子. 最多需要4个封锁点. 所以我们可以采取这样的策略: 1.寻找一条盗贼的可行路线,如果没有,返回0. 2.计算封锁出口和入口四 ...

  10. Flex XML搜索、匹配

    - <?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx=" ...