컴퓨터 사이언스/1고리즘

백준 12015 : 가장 긴 증가하는 부분 수열 2

저세상 개발자 2021. 9. 7. 01:17

https://www.acmicpc.net/problem/12015

 

12015번: 가장 긴 증가하는 부분 수열 2

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

www.acmicpc.net

 

LIS 문제다. N의 크기가 100만으로 O(N^2) 풀이는 시간 초과가 발생하니 O(NlogN)으로 해결하면 된다.

아래 문제와 거의 유사한 문제다.

https://unfunhy.tistory.com/112

 

백준 2352 : 반도체 설계

https://www.acmicpc.net/problem/2352 2352번: 반도체 설계 첫째 줄에 정수 n(1 ≤ n ≤ 40,000)이 주어진다. 다음 줄에는 차례로 1번 포트와 연결되어야 하는 포트 번호, 2번 포트와 연결되어야 하는 포트 번호,.

unfunhy.tistory.com

 

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int n;
void solution() {
	int tmp, target;
	vector<int> ans;

	cin >> n;
	for (int i = 0; i < n; i++) {
		cin >> tmp;
		if (ans.empty() || ans.back() < tmp) ans.push_back(tmp);
		else {
			target = lower_bound(ans.begin(), ans.end(), tmp) - ans.begin();
			ans[target] = tmp;
		}
	}
	cout << ans.size();
}

int main() {
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	solution();

	return 0;
}
메모리: 8292 kb 시간: 176 ms