📦12015: 가장 긴 증가하는 부분 수열 2
[알고리즘 풀이] 강동규
Reviewed by Kade Kang (devkade12@gmail.com)
Reviewed:: 2024-02-19
문제 확인하기
풀이
- 해당 수열의 크기가 1,000,000 이 최대이기 때문에
의 방법으로는 풀 수 없다. - 때문에 이분 탐색을 통해
의 방식으로 풀이한다.
#include <iostream>
#include <algorithm>
#include <vector>
#define endl '\n'
using namespace std;
int N;
int arr[1000001];
vector<int> vec;
void Input(){
cin >> N;
for(int i=0; i<N; i++){
cin >> arr[i];
}
}
int binary_search(int target){
int start = -1;
int end = vec.size()-1;
while(end > start+1){
int mid = (start + end)/2;
if(vec[mid] >= target){
end = mid;
}
else start = mid;
}
return end;
}
void Solution(){
vec.push_back(arr[0]);
for(int i=1; i<N; i++){
if(vec.back() < arr[i]){
vec.push_back(arr[i]);
}
else {
int idx = binary_search(arr[i]);
vec[idx] = arr[i];
}
}
cout << vec.size() << endl;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
Input();
Solution();
return 0;
}