Skip to content

Commit

Permalink
[Platinum V] Title: 가장 긴 증가하는 부분 수열 5, Time: 208 ms, Memory: 22252 KB…
Browse files Browse the repository at this point in the history
… -BaekjoonHub
  • Loading branch information
belowyoon committed Mar 6, 2024
1 parent b172eb6 commit 9e41d58
Show file tree
Hide file tree
Showing 2 changed files with 86 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -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

### 문제 설명

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

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

### 입력

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

<p>둘째 줄에는 수열 A를 이루고 있는 A<sub>i</sub>가 주어진다. (-1,000,000,000 ≤ A<sub>i</sub> ≤ 1,000,000,000)</p>

### 출력

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

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

Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
//freopen("input.txt", "r", stdin);
int n;
cin >> n;

vector<int> index(n, 0);
vector<int> arr(n, 0);
vector<int> 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<int> 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;
}

0 comments on commit 9e41d58

Please sign in to comment.