#include <bits/stdc++.h>
#define mk make_pair
#define lp(i,a,b) for(int i = a ; i < b; i++ )
#define sz(x) (int)x.size()
#define all(x) x.begin(),x.end()
const int MAX = 1e6+5 ;
using namespace std ;
int main(){
ios_base::sync_with_stdio(false );
cin.tie(0) ;
int N ;
cin >> N ;
vector<int> arr(N) , idx(N) ; iota(all(idx) , 0) ;
vector<int> corte(N) , mx(N) , tam(N) ;
for(auto &e : arr ) cin >> e ;
sort(all(idx),[&](int a, int b) { return arr[a] > arr[b] ; }) ;
vector<int> dp(N) ;
vector< vector<int> > sweep( N+1 , vector<int>() ) ;
for(int i = 0 ; i < N ; i++ ){
if(arr[idx[i]]+i <= N) sweep[arr[idx[i]]+i].push_back(i) ;
dp[i] = -2*N ;
corte[i] = -1 ;
if(i+1 >= arr[idx[0]]) dp[i] = 1 , tam[i] = i+1 ;
for(auto e : sweep[i+1]){
if(e == 0) continue ;
if( i-e+1 >= arr[idx[e]] && mk(dp[e-1]+1,-max(tam[e-1], i-e+1) ) > mk(dp[i] , -tam[i]) ){
corte[i] = e-1 ;
dp[i] = dp[e-1]+1 ;
tam[i] = max(tam[e-1] , i-e+1 ) ;
}
}
if(i && dp[i-1] > 0 ){
int p = i/dp[i-1] ;
if( tam[i-1] > p || tam[i-1]*dp[i-1] > i ){
if(mk(dp[i-1], -tam[i-1]) > mk(dp[i] , -tam[i]) ){
dp[i] = dp[i-1] ;
tam[i] = tam[i-1] ;
}
}
else if( mk(dp[i-1], -tam[i-1]-1) > mk(dp[i] , -tam[i]) ){
dp[i] = dp[i-1] ;
tam[i] = tam[i-1]+1 ;
}
}
//cout << dp[i] << " " << tam[i] << endl ;
}
vector<vector<int> > ans ;
int x = N-1 ;
while(x != -1){
ans.push_back(vector<int>()) ;
int i ;
for(i = x-arr[idx[x]] ; i >= max(0,x-tam[x]) ; i-- ){
if(dp[i] == dp[x]-1 && tam[i] <= tam[x] && arr[idx[i+1]] <= x-i ) break ;
}
for(int j = i+1 ; j<= x ;j++ ) ans.back().push_back(idx[j]+1) ;
x = i ;
}
cout << sz(ans) <<"\n" ;
for(auto e : ans ){
cout << sz(e) <<" " ;
for(auto ee : e ) cout << ee <<" " ;
cout << "\n" ;
}
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
0 ms |
204 KB |
Output is correct |
2 |
Correct |
0 ms |
204 KB |
Output is correct |
3 |
Correct |
0 ms |
204 KB |
Output is correct |
4 |
Correct |
0 ms |
204 KB |
Output is correct |
5 |
Correct |
0 ms |
204 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
0 ms |
204 KB |
Output is correct |
2 |
Correct |
0 ms |
204 KB |
Output is correct |
3 |
Correct |
1 ms |
204 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
204 KB |
Output is correct |
2 |
Correct |
1 ms |
204 KB |
Output is correct |
3 |
Correct |
1 ms |
204 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
2 ms |
716 KB |
Output is correct |
2 |
Correct |
2 ms |
688 KB |
Output is correct |
3 |
Correct |
2 ms |
716 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
4 ms |
588 KB |
Output is correct |
2 |
Correct |
2 ms |
716 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
23 ms |
6860 KB |
Output is correct |
2 |
Correct |
32 ms |
7532 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
27 ms |
7892 KB |
Output is correct |
2 |
Correct |
20 ms |
7244 KB |
Output is correct |
3 |
Correct |
27 ms |
8388 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
223 ms |
67464 KB |
Output is correct |
2 |
Correct |
221 ms |
69520 KB |
Output is correct |
3 |
Correct |
225 ms |
65120 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
301 ms |
86968 KB |
Output is correct |
2 |
Correct |
391 ms |
143268 KB |
Output is correct |
3 |
Correct |
277 ms |
92460 KB |
Output is correct |
4 |
Correct |
317 ms |
78480 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
295 ms |
75796 KB |
Output is correct |
2 |
Correct |
205 ms |
62112 KB |
Output is correct |
3 |
Correct |
273 ms |
90156 KB |
Output is correct |
4 |
Correct |
393 ms |
94352 KB |
Output is correct |