您的位置:首页 > 其它

Atcoder Grand Contest 014F - Strange Sorting

2017-05-07 00:01 134 查看

Problem Statement

Takahashi loves sorting.
He has a permutation (p1,p2,…,pN) of
the integers from 1 through N.
Now, he will repeat the following operation until the permutation becomes (1,2,…,N):
First, we will define high and low elements in the permutation, as follows. The i-th
element in the permutation is high if the maximum element between the 1-st and i-th
elements, inclusive, is the i-th element itself, and otherwise the i-th
element is low.
Then, let a1,a2,…,ak be
the values of the high elements, and b1,b2,…,bN−k be
the values of the low elements in the current permutation, in the order they appear in it.
Lastly, rearrange the permutation into (b1,b2,…,bN−k,a1,a2,…,ak).
How many operations are necessary until the permutation is sorted?

Constraints

1≤N≤2×105
(p1,p2,…,pN) is
a permutation of the integers from 1 through N.

Input

Input is given from Standard Input in the following format:
N
p1 p2 ... pN


Output

Print the number of operations that are necessary until the permutation is sorted.

Sample Input 1

Copy
5
3 5 1 2 4


Sample Output 1

Copy
3

The initial permutation is (3,5,1,2,4),
and each operation changes it as follows:
In the first operation, the 1-st and 2-nd
elements are high, and the 3-rd, 4-th
and 5-th are low. The permutation becomes: (1,2,4,3,5).
In the second operation, the 1-st, 2-nd, 3-rd
and 5-th elements are high, and the 4-th
is low. The permutation becomes: (3,1,2,4,5).
In the third operation, the 1-st, 4-th
and 5-th elements are high, and the 2-nd
and 3-rd and 5-th
are low. The permutation becomes: (1,2,3,4,5).

Sample Input 2

Copy
5
5 4 3 2 1


Sample Output 2

Copy
4


Sample Input 3

Copy
10
2 10 5 7 3 6 4 9 8 1


Sample Output 3

Copy
6


题意:给一个排列,
 每次把max(a[1] to a[i]) = a[i]的放进vector A(记为high)里,其他放进vector B(记为low)里

然后把序列改成B + A

问升序排序需要搞多少次
题解:
我基本就是在翻译题解...

考虑去掉1剩下2到n的序列,剩下的答案是T,1并不影响其他数的操作

那么最后的答案一定是T或者T + 1

如果T = 0,直接判

如果T > 0,

考虑T - 1次操作之后的情况

记f为这个序列的第一项,显然f > 2

(如果f = 2,那么要么这个序列已经被排好序或者下一次f会被移到后面)

如果最后是(f, 1, 2)答案是T否则是T + 1

结论1:

(考虑序列2到n)

在前T - 1次, f不会出现它在不第一个位置且它又是high的情况

证明1:

考虑某个时刻x是high但是不在第一个位置, 显然第一个位置是high, 故vectorA中x前面还有一个数,记为y, y < x

如果x, y都是high或者都是low,它们的相对位置不变

如果x, y是high而y变成low了,这时y仍然在x左边,如果x不在第一个位置,和之前一样了

结论2:

定义循环序列(a, b, c) = (b, c, a) = (c, a, b)

则1, 2, f在前T - 1次组成的(关于它们位置的)循环序列不会变

证明2:

如果1是第一个元素

{
如果2是第二个元素,那么1, 2是high, f是low
如果f是第二个元素,那么1, f是high, 2是low
否则2, f都是low

}

如果2是第一个元素,那么2是high,1和f是low

如果f是第一个元素,那么f是high,1和2是low

否则1, 2, f都是low

然后就证明完了

#include <bits/stdc++.h>
#define xx first
#define yy second
#define mp make_pair
#define pb push_back
#define fill( x, y ) memset( x, y, sizeof x )
#define copy( x, y ) memcpy( x, y, sizeof x )
using namespace std;

typedef long long LL;
typedef pair < int, int > pa;

inline int read()
{
int sc = 0, f = 1; char ch = getchar();
while( ch < '0' || ch > '9' ) { if( ch == '-' ) f = -1; ch = getchar(); }
while( ch >= '0' && ch <= '9' ) sc = sc * 10 + ch - '0', ch = getchar();
return sc * f;
}

const int MAXN = 200020;

int q[MAXN], p[MAXN], n, T[MAXN], f[MAXN];

int main()
{
#ifdef wxh010910
freopen( "data.in", "r", stdin );
#endif
n = read();
for( int i = 1 ; i <= n ; i++ ) q[ p[ i ] = read() ] = i;
for( int i = n - 1 ; i ; i-- )
{
if( !T[ i + 1 ] )
{
if( q[ i ] > q[ i + 1 ] ) T[ i ] = 1, f[ i ] = i + 1;
else T[ i ] = 0;
}
else
{
int cnt = 0;
cnt += q[ f[ i + 1 ] ] < q[ i ];
cnt += q[ i ] < q[ i + 1 ];
cnt += q[ i + 1 ] < q[ f[ i + 1 ] ];
if( cnt == 2 ) T[ i ] = T[ i + 1 ], f[ i ] = f[ i + 1 ];
else T[ i ] = T[ i + 1 ] + 1, f[ i ] = i + 1;
}
}
return printf( "%d\n", T[ 1 ] ), 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: