This problem statement is the exclusive and proprietary property of TopCoder, Inc. Any unauthorized use or reproduction of this information without the prior written consent of TopCoder, Inc. is strictly prohibited. (c)2010, TopCoder, Inc. All rights reserved.
与えられた数列$data$を全ての$i$に対して$data[i] + 1$$!=$$data[i+1]$が成り立つようにした場合の辞書順最小を答える.
特に制限が無ければsortされたものが最小なので,その状態から制限を満たすように変形していく.最後に答えの数列に追加したものを$last$とする.新たに追加するものは$last+1$でない必要がある.またこの要素を追加してしまったために,最後に矛盾が起きるのを避けられない場合でない必要もある.矛盾が起きる場合とは,まだ答えの数列に追加していない中で,追加しようとしているものが最小値であり,最長値$+1$$==$最大値の関係にある場合である.
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include <iostream>
#include <sstream>
#include <vector>
#include <string>
#include <cstring>
#include <algorithm>
#include <map>
#include <set>
#include <queue>
#define REP(i,k,n) for(int i=k;i<n;i++)
#define rep(i,n) for(int i=0;i<n;i++)
#define each(it,v) for(__typeof((v).begin()) it=(v).begin();it!=(v).end();it++)
#define INF 1<<30
#define mp make_pair
using namespace std ;
typedef long long ll ;
typedef pair < int , int > P ;
class WeirdSort {
public :
vector < int > sortArray ( vector < int > data ) {
int n = data . size ();
sort ( data . begin (), data . end ());
int last = - 100 ;
vector < int > ans ;
bool used [ 55 ];
memset ( used , 0 , sizeof ( used ));
rep ( t , n ) {
int front = - 1 , back = - 1 ;
rep ( i , n ) {
if ( used [ i ]) continue ;
front = data [ i ];
break ;
}
for ( int i = n - 1 ; i >= 0 ; i -- ) {
if ( used [ i ]) continue ;
back = data [ i ];
break ;
}
rep ( i , n ) {
if ( used [ i ]) continue ;
if ( last + 1 == data [ i ]) continue ;
if ( data [ i ] == front && front + 1 == back ) continue ;
last = data [ i ];
used [ i ] = true ;
ans . push_back ( data [ i ]);
break ;
}
}
return ans ;
}
};