https://www.acmicpc.net/problem/30297
순열P를 irreducible한 순열로 만드는 문제이다.
reducible의 정의로는 배열의 앞에서 하나씩 원소를 떼서 부분집합을 만들었을 때 순열을 만족하면 reducible한 순열이다.
(단, 자기 자신은 제외)
irreducible한 순열이 되기 위해서는...
i번째 원소까지의 최대값이 i보다 커질수 있도록 스왑하면서 이동하면 된다.
입력으로 주어지는 N의 값의 합이 500000이하인 것이 보장되므로 테스트 케이스 하나당 O(N)으로 해결하면 된다.
#include <iostream>
#include <algorithm>
#include <vector>
#define endl "\n"
using namespace std;
int t, n, m, tmp;
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin >> t;
while(t--){
cin >> n;
vector<int> arr(n,0);
vector<int> ans;
for(auto &i : arr) cin >> i;
m = arr[0];
for(int i = 0; i < n-1; i++){
m = max(arr[i],m);
if(i+1 >= m){
m = arr[i+1];
tmp = arr[i+1];
arr[i+1] = arr[i];
arr[i] = tmp;
ans.push_back(i+1);
}
}
if(ans.size()!=0){
cout << ans.size() << endl;
for(auto v:ans) cout << v << " ";
}else{
cout << 0 << endl;
}
cout << endl;
}
}
'📚알고리즘 > 백준' 카테고리의 다른 글
[백준 19846번] 신기한 연산 (C++) (0) | 2024.11.24 |
---|---|
[백준 13018번] 특이한 수열 (C++) (0) | 2024.11.23 |
[백준 13955번] Key Knocking (1) | 2024.11.18 |
[백준 31577번] 랜섬웨어와 비트코인 (C++) (2) | 2024.11.15 |
[백준 7453번] 합이 0인 네 정수 (C++) (0) | 2024.07.21 |