https://www.acmicpc.net/problem/14003
이건 유사문제
https://www.acmicpc.net/problem/2568
그냥 LIS 계산하고 LIS의 길이만 묻는게 아니라 LIS 원본을 묻는 문제
index 배열을 만들고 해당 배열에 i는 LIS의 몇번 index에 들어갔는가를 저장함
마지막에 뒤에서부터 --하면서 같은 숫자면 넣고 reverse
#include <bits/stdc++.h>
using namespace std;
#define INF 2147483647
int main()
{
int N;
cin >> N;
vector<int> input(N), index(N);;
for (int i = 0; i < N ; i++) { cin >> input[i]; }
vector<int> lis_vec;
lis_vec.push_back(-INF);
for (int i = 0; i < N; i++) {
if (lis_vec.back() < input[i]) {
lis_vec.push_back(input[i]);
index[i] = lis_vec.size() - 1;
}
else {
auto itr = lower_bound(lis_vec.begin(), lis_vec.end(), input[i]);
*itr = input[i];
index[i] = itr - lis_vec.begin();
}
}
int lis = lis_vec.size() - 1;
cout << lis << '\n';
vector<int> answer;
for (int i = N - 1; i >= 0; i--) {
if (index[i] == lis) {
answer.push_back(input[i]);
lis--;
}
}
for (auto ritr = answer.rbegin(); ritr != answer.rend(); ritr++) {
cout << *ritr << ' ';
}
return 0;
}