diff --git "a/\353\260\261\354\244\200/Platinum/14003.\342\200\205\352\260\200\354\236\245\342\200\205\352\270\264\342\200\205\354\246\235\352\260\200\355\225\230\353\212\224\342\200\205\353\266\200\353\266\204\342\200\205\354\210\230\354\227\264\342\200\2055/README.md" "b/\353\260\261\354\244\200/Platinum/14003.\342\200\205\352\260\200\354\236\245\342\200\205\352\270\264\342\200\205\354\246\235\352\260\200\355\225\230\353\212\224\342\200\205\353\266\200\353\266\204\342\200\205\354\210\230\354\227\264\342\200\2055/README.md" new file mode 100644 index 0000000..a826e9f --- /dev/null +++ "b/\353\260\261\354\244\200/Platinum/14003.\342\200\205\352\260\200\354\236\245\342\200\205\352\270\264\342\200\205\354\246\235\352\260\200\355\225\230\353\212\224\342\200\205\353\266\200\353\266\204\342\200\205\354\210\230\354\227\264\342\200\2055/README.md" @@ -0,0 +1,34 @@ +# [Platinum V] 가장 긴 증가하는 부분 수열 5 - 14003 + +[문제 링크](https://www.acmicpc.net/problem/14003) + +### 성능 요약 + +메모리: 22252 KB, 시간: 208 ms + +### 분류 + +이분 탐색, 가장 긴 증가하는 부분 수열: O(n log n) + +### 제출 일자 + +2024년 3월 6일 15:12:20 + +### 문제 설명 + +

수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오.

+ +

예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이고, 길이는 4이다.

+ +### 입력 + +

첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000,000)이 주어진다.

+ +

둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (-1,000,000,000 ≤ Ai ≤ 1,000,000,000)

+ +### 출력 + +

첫째 줄에 수열 A의 가장 긴 증가하는 부분 수열의 길이를 출력한다.

+ +

둘째 줄에는 정답이 될 수 있는 가장 긴 증가하는 부분 수열을 출력한다.

+ diff --git "a/\353\260\261\354\244\200/Platinum/14003.\342\200\205\352\260\200\354\236\245\342\200\205\352\270\264\342\200\205\354\246\235\352\260\200\355\225\230\353\212\224\342\200\205\353\266\200\353\266\204\342\200\205\354\210\230\354\227\264\342\200\2055/\352\260\200\354\236\245\342\200\205\352\270\264\342\200\205\354\246\235\352\260\200\355\225\230\353\212\224\342\200\205\353\266\200\353\266\204\342\200\205\354\210\230\354\227\264\342\200\2055.cc" "b/\353\260\261\354\244\200/Platinum/14003.\342\200\205\352\260\200\354\236\245\342\200\205\352\270\264\342\200\205\354\246\235\352\260\200\355\225\230\353\212\224\342\200\205\353\266\200\353\266\204\342\200\205\354\210\230\354\227\264\342\200\2055/\352\260\200\354\236\245\342\200\205\352\270\264\342\200\205\354\246\235\352\260\200\355\225\230\353\212\224\342\200\205\353\266\200\353\266\204\342\200\205\354\210\230\354\227\264\342\200\2055.cc" new file mode 100644 index 0000000..5b0dfee --- /dev/null +++ "b/\353\260\261\354\244\200/Platinum/14003.\342\200\205\352\260\200\354\236\245\342\200\205\352\270\264\342\200\205\354\246\235\352\260\200\355\225\230\353\212\224\342\200\205\353\266\200\353\266\204\342\200\205\354\210\230\354\227\264\342\200\2055/\352\260\200\354\236\245\342\200\205\352\270\264\342\200\205\354\246\235\352\260\200\355\225\230\353\212\224\342\200\205\353\266\200\353\266\204\342\200\205\354\210\230\354\227\264\342\200\2055.cc" @@ -0,0 +1,52 @@ +#include +#include +#include +using namespace std; + +int main() +{ + ios_base::sync_with_stdio(0); + cin.tie(0); + //freopen("input.txt", "r", stdin); + int n; + cin >> n; + + vector index(n, 0); + vector arr(n, 0); + vector sorts; + + for (int i = 0; i < n; i++) { + cin >> arr[i]; + } + + sorts.push_back(arr[0]); + for (int i = 1; i < n; i++) { + if (sorts[sorts.size()-1] < arr[i]) { + sorts.push_back(arr[i]); + index[i] = sorts.size() - 1; + } else { + int l = 0; + int r = sorts.size() - 1; + while (l < r) { + int mid = (l + r) / 2; + if (arr[i] <= sorts[mid]) r = mid; + else l = mid + 1; + } + sorts[l] = arr[i]; + index[i] = l; + } + } + cout << sorts.size() << '\n'; + vector ans; + int fIndex = sorts.size() - 1; + for (int i = n - 1; i >= 0; i--) { + if (fIndex == index[i]) { + ans.push_back(arr[i]); + fIndex--; + } + } + for (int i = ans.size() - 1; i >= 0; i--) { + cout << ans[i] << " "; + } + return 0; +} \ No newline at end of file