알고리즘/BOJ

백준 12738번 가장 긴 증가하는 부분 수열 3

꾸준함. 2019. 3. 4. 07:01

문제 링크입니다: https://www.acmicpc.net/problem/12738


N이 최대 1,000,000이기 때문에 O(N^2)으로는 풀 수 없는 문제입니다.

따라서, O(NlogN)으로 LIS의 길이를 구해줘야합니다.


#include <iostream>

#include <algorithm>

using namespace std;

 

const int MAX = 1000000 + 1;

 

int N;

int arr[MAX];

int cache[MAX];

 

int LIS(void)

{

        int idx = 0;

        cache[idx] = arr[0];

 

        for (int i = 1; i < N; i++)

        {

                 //오름차순이라면

                 if (cache[idx] < arr[i])

                 {

                         cache[++idx] = arr[i];

                 }

                 //치환

                 else

                 {

                         int idx2 = lower_bound(cache, cache + idx, arr[i]) - cache;

                         cache[idx2] = arr[i];

                 }

        }

        return idx + 1;

}

 

int main(void)

{

        ios_base::sync_with_stdio(0);

        cin.tie(0);

        cin >> N;

 

        for (int i = 0; i < N; i++)

                 cin >> arr[i];

 

        cout << LIS() << "\n";

        return 0;

}


개발환경:Visual Studio 2017


지적, 조언, 질문 환영입니다! 댓글 남겨주세요~

반응형

'알고리즘 > BOJ' 카테고리의 다른 글

백준 1011번 Fly me to the Alpha Centauri  (2) 2019.03.07
백준 11365번 !밀비 급일  (0) 2019.03.04
백준 1708번 볼록 껍질  (1) 2019.02.28
백준 8903번 장비  (0) 2019.02.26
백준 1672번 DNA 해독  (0) 2019.02.24