본문 바로가기
problem-solving

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

by pikkaso 2022. 3. 7.

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

NlogN 으로 풀어야 한다.

증가수열 이므로 만약 새로운 인풋 x가 들어왔을때,   x1<x2<..<xk<x<a1<a2<..<am 형식의 기존 수열이 있었다면, 기존 x자리에 새 인풋인 똑같은 x를 집어넣는 작업을 해야한다. 왜냐면 upper_bound쓰면, x1<x2<..<xk<x<x<a2<..<am이 되어 모순이기 때문이다. 

 

#include<bits/stdc++.h>
using namespace std;

int main(){

    int n,x,c=0;
    cin>>n;
    vector<int> v;
    v.push_back(INT_MIN);
    for(int i=0;i<n;i++){
        cin>>x;
        if(x>v[v.size()-1]){
            v.push_back(x);
            c++;
        }else{
            int replace_idx = lower_bound(v.begin(),v.end(),x) - v.begin();
            v[replace_idx] = x;
        }
    }
    cout<<c<<'\n';

    return 0;
}

 

'problem-solving' 카테고리의 다른 글

boj 21099: Four XOR  (0) 2022.03.07
boj 3653: 영화 수집  (0) 2022.03.07
boj 2254: 감옥 건설  (0) 2022.03.04
boj 2848: 알고스팟어  (0) 2022.03.04
boj 2166: 다각형의 면적  (0) 2022.02.27

댓글