Skip to content

Commit

Permalink
24-07-22 가장 긴 증가하는 부분 수열 5
Browse files Browse the repository at this point in the history
  • Loading branch information
makehard23 committed Jul 22, 2024
1 parent 4229c80 commit 3c50858
Show file tree
Hide file tree
Showing 2 changed files with 78 additions and 1 deletion.
76 changes: 76 additions & 0 deletions yuyu0830/LIS/14003.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
#include <iostream>
#include <map>
#include <vector>

#define NUM 1000010
#define fastio ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);

using namespace std;

typedef pair<int, int> ii;

int cnt = 0;
int arr[NUM] = {0, };
vector<ii> v[NUM];

// 이진 탐색
int bs(int value) {
int low = 0, mid, high = cnt;

while (low <= high) {
mid = (low + high) / 2;

if (v[mid].back().first == value)
return -1;

if (value < v[mid].back().first) high = mid - 1;
else low = mid + 1;
}

return mid + (value < v[mid].back().first ? -1 : 0);
}

int main() {
fastio;

int n; cin >> n;

for (int i = 0; i < n; i++) {
cin >> arr[i];
}

// 오류 대비 초기값
v[0].push_back(make_pair(-1000000001, 0));

for (int i = 0; i < n; i++) {
int l = arr[i];

if (l > v[cnt].back().first) {
// 만약 가장 큰 값이면 맨 앞에 두기
v[++cnt].push_back(make_pair(l, v[cnt - 1].size()));
continue;
}

// 중간에 들어가야하는 값이면 앞의 요소가 뭔지 저장한 뒤에 벡터에 보관
int t = bs(l) + 1;
if (t == 0) continue;

v[t].push_back(make_pair(l < v[t].back().first ? l : v[t].back().first, v[t - 1].size()));
}

printf("%d\n", cnt);

// 가장 끝 요소부터 역순으로 순서 찾아오기
vector<int> ans;
ii tmp = v[cnt--][0];

do {
ans.push_back(tmp.first);
tmp = v[cnt][tmp.second - 1];
} while(cnt--);

while (!ans.empty()) {
printf("%d ", ans.back());
ans.pop_back();
}
}
3 changes: 2 additions & 1 deletion yuyu0830/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,5 +16,6 @@
| 12차시| 2024.05.13 | 해시 | [두 배열의 합](https://www.acmicpc.net/problem/2143) | - |
| 13차시| 2024.05.21 | LIS | [가장 긴 증가하는 부분 수열 2](https://www.acmicpc.net/problem/12015) | - |
| 15차시| 2024.06.01 | 기하 | [다각형의 면적](https://www.acmicpc.net/problem/2166) | - |
| 16차시 | 2024.06.04 | 별자리 만들기 | [별자리 만들기](https://www.acmicpc.net/problem/4386) | - |
| 16차시 | 2024.06.04 | MST | [별자리 만들기](https://www.acmicpc.net/problem/4386) | - |
| 20차시 | 2024.07.22 | LIS | [가장 긴 증가하는 부분 수열 5](https://www.acmicpc.net/problem/4386) | - |
---

0 comments on commit 3c50858

Please sign in to comment.