알고리즘/백준
[백준] 14003 - 가장 긴 증가하는 부분 수열 5
래울
2024. 6. 12. 16:47
가장 긴 증가하는 부분 수열 5: https://www.acmicpc.net/problem/14003
알고리즘: LIS - O(nlogn) + LIS - 경로 추적
코드
#include <iostream>
#include <algorithm>
#include <vector>
#include <stack>
using namespace std;
int N;
int arr[1000011];
int dp[1000011];
vector<int> path;
int main()
{
cin >> N;
for (int i = 0; i < N; ++i) {
cin >> arr[i];
}
dp[0] = -1111111111;//
int level = 0;
for (int i = 0; i < N; ++i)
{
if (dp[level] < arr[i]) {
dp[++level] = arr[i];
path.push_back(level);
}
else {
int* ptr = lower_bound(dp, dp + level + 1, arr[i]);
*ptr = arr[i];
int value = ptr - dp;
path.push_back(value);
}
}
for (int i = 1; i <= level; ++i) cout << dp[i] << " ";
stack<int> ans;
for (int i = N - 1; i >= 0; --i)
{
if (level < 1) break;
if (path[i] == level) {
ans.push(arr[i]);
level--;
}
}
cout << ans.size() << "\n";
while (!ans.empty()) {
cout << ans.top() << " ";
ans.pop();
}
return 0;
}