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
Copy5 3 5 1 2 4
Sample Output 1
Copy3
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
Copy5 5 4 3 2 1
Sample Output 2
Copy4
Sample Input 3
Copy10 2 10 5 7 3 6 4 9 8 1
Sample Output 3
Copy6
题意:给一个排列,
每次把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; }
相关文章推荐
- AtCoder Grand Contest 010 D - Decrementing 博弈论
- Atcoder Grand Contest 016 F Games on DAG
- AtCoder Grand Contest 072 F - Dam
- AtCoder Grand Contest 017 C - Snuke and Spells
- AtCoder Grand Contest 018 A - Getting Difference
- AtCoder Grand Contest 018 E - Sightseeing Plan
- AtCoder Grand Contest 001 B - Mysterious Light
- AtCoder Grand Contest 010D
- AtCoder Grand Contest 004 C - AND Grid(思路题)
- AtCoder Grand Contest 008
- AtCoder Grand Contest 002 E - Candy Piles
- AtCoder Grand Contest 020 B - Ice Rink Game(贪心+计算机乘法)
- AtCoder Grand Contest 020 C - Median Sum (背包问题+bitset )
- 构造——AtCoder Grand Contest 010 B
- AtCoder Grand Contest 016 B - Colorful Hats 乱搞
- AtCoder Grand Contest 004 C - AND Grid 构造
- AtCoder Grand Contest 005 E - Sugigma: The Showdown 博弈论+贪心
- AtCoder Grand Contest 006 D - Median Pyramid Hard 二分答案
- Atcoder Grand Contest 021 C 题解
- AtCoder Grand Contest 018 E - Sightseeing Plan