728x90
https://www.acmicpc.net/problem/14003
문제 접근
LIS 4번 문제와 다른 점은 인풋의 갯수와 크기 뿐이다. 따라서 이전과 동일하다.
코드
#include <iostream>
using namespace std;
int n;
int arr[1000001], dp[1000001], p[1000001];
int binary(int left, int right, int key) {
int mid;
while (left <= right) {
mid = (left + right) / 2;
if (dp[mid] >= key) right = mid - 1;
else left = mid + 1;
}
return left;
}
void backtrace(int idx, int len) {
if (idx < 0) return;
if (p[idx] == len) {
backtrace(idx - 1, len - 1);
cout << arr[idx] << " ";
}
else backtrace(idx - 1, len);
}
int main() {
cin >> n;
for (int i = 0; i < n;i++) {
cin >> arr[i];
}
dp[0] = arr[0];
int idx = 0;
for (int i = 0; i < n;i++) {
if (dp[idx] < arr[i]) dp[++idx] = arr[i];
else {
int lower_bound = binary(0, idx, arr[i]);
dp[lower_bound] = arr[i];
}
p[i] = binary(0, idx, arr[i]) + 1;
}
cout << idx + 1 << "\n";
backtrace(n, idx + 1);
}
'문제 풀이 > 백준(BOJ)' 카테고리의 다른 글
[C++] 백준 2565번 : 전깃줄 (0) | 2021.06.23 |
---|---|
[C++] 백준 11054번 : 가장 긴 바이토닉 부분 수열 (0) | 2021.06.23 |
[C++] 백준 14002번 : 가장 긴 증가하는 부분 수열4 (0) | 2021.06.22 |
[C++] 백준 12738번 : 가장 긴 증가하는 부분 수열3 (0) | 2021.06.22 |
[C++] 백준 12015번 : 가장 긴 증가하는 부분 수열2 (0) | 2021.06.21 |
댓글