Algorithm/problem
백준 14003번 : 가장 긴 증가하는 부분 수열 5 - LIS
DingCoDing
2022. 11. 30. 12:52
반응형
https://www.acmicpc.net/problem/14003
#include <bits/stdc++.h>
#define MX 1'000'003
using namespace std;
int n;
vector<int> v, ans, forPrint;
int arr[MX], indexArr[MX];
int lower_bound(int val) {
int st = 0;
int en = ans.size() - 1;
while (st <= en) {
int mid = (st + en) / 2;
if (ans[mid] >= val) {
en = mid - 1;
} else {
st = mid + 1;
}
}
return st;
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n;
for (int i = 0; i < n; i++) {
cin >> arr[i];
int idx = lower_bound(arr[i]);
if (idx == ans.size()) {
ans.push_back(arr[i]);
} else {
ans[idx] = arr[i];
}
indexArr[i] = idx;
}
int answer = ans.size();
cout << answer << '\n';
for (int i = n - 1; i >= 0; i--) {
if (indexArr[i] == answer - 1) {
forPrint.push_back(arr[i]);
answer--;
}
}
for (int i = forPrint.size() - 1; i >= 0; i--) {
cout << forPrint[i] << ' ';
}
return 0;
}
반응형