BOJ 14003 가장 긴 증가하는 부분 수열 5

1 개요[ | ]

BOJ 14003 가장 긴 증가하는 부분 수열 5

2 같이 보기[ | ]

3 C++[ | ]

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

int N;
int A[1000001];
int B[1000001];
vector<int> v;

void solve() {
    for (int i = 1; i <= N; i++) {
        if (v.size() == 0 || v[v.size() - 1] < A[i]) {
            v.push_back(A[i]);
            B[i] = v.size() - 1;
            continue;
        }
        int left = 0;
        int right = v.size() - 1;
        while (left < right) {
            int mid = (left + right) / 2;
            if (v[mid] >= A[i]) {
                right = mid;
            } else {
                left = mid + 1;
            }
        }
        v[left] = A[i];
        B[i] = left;
    }
    cout << v.size() << endl;
    int idx = v.size() - 1;
    stack<int> s;
    for (int i = N; i > 0; i--) {
        if (B[i] == idx) {
            idx--;
            s.push(A[i]);
        }
    }
	while(!s.empty()) {
	    cout << s.top() << ' ';
	    s.pop();
	}
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin >> N;
    for (int i = 1; i <= N; i++) {
        cin >> A[i];
    }
    solve();
}
문서 댓글 ({{ doc_comments.length }})
{{ comment.name }} {{ comment.created | snstime }}