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. thinkphp phpexcel导出

    近期做一个项目涉及到商品信息的批量导出与导入,遂记录了下来,框架是tp框架3.2.3(tp5.0性质是一样的,无非是加载方法与所放目录不一样罢了),运用的是phpexcel,闲话不多说,上代码 1.首 ...

  2. POJ 1151Atlantis 扫描线+线段树求矩形面积并

    题目链接 #include <iostream> #include <vector> #include <cstdio> #include <cstring& ...

  3. python3.4 使用pymssql 乱码

    问题:sqlserver数据库编码为gbk,使用python3.4+pymssql 查询,中文乱码 解决办法: conn = pymssql.connect(host="192.168.12 ...

  4. jQuery ajax在GBK编码下表单提交终极解决方案(非二次编码方法)(转)

    版权声明]:版权归作者所有,转载时请以超链接形式标明文章原始出处和作者信息及本声明:http://www.open-lib.com/Forum/Read_69_1.action 前言: 当jquery ...

  5. 统计难题(trie树)

    统计难题 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/Others)Total Submi ...

  6. SRM 585

    250 : 递推,从左下角到右下角走一条,剩下的都是子结构 const int mod = 1000000007; long long dp[1000010] , s[1000010]; class ...

  7. SVN使用技巧

    安装 下载SVN服务端:VisualSVN Server https://www.visualsvn.com/downloads/ 安装,下一步...(更改地址,Location是安装目录,Repos ...

  8. javaweb学习路之三--websocket多人在线聊天

    在之前的项目基础上,加入了一个聊天室的功能,为了界面好看 引入了AmazeUI和umeditor最终效果图如下: 源码在 https://github.com/Zering/MyWeb 目前练习都在这 ...

  9. Java多线程之synchronized(二)

    为了解决“非线程安全”带来的问题,上一节中使用的办法是用关键字synchronized修饰多个线程可能同时访问到的方法,但是这样写是存在一定的弊端的,比如线程A调用一个用synchronized修饰的 ...

  10. 裸机离奇事件:Freescale usb 有关fault

    裸机离奇事件:Freescale usbucosiiFreescale\KSDK_1.2.0\examples\twrk65f180m\demo_apps\usb\host\cdc\cdc_seria ...