Problem Solving/BOJ

[백준 / BOJ] C++ 3066 브리징 시그널

nageune 2023. 3. 16. 09:00
728x90
반응형

3066번: 브리징 시그널

 

문제

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

 

3066번: 브리징 시그널

입력의 첫 줄에는 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 첫 번째 줄에 포트의 개수 N(1 ≤ N ≤ 40000)이 주어지고, 두 번째 줄부터는 왼쪽 블록의 포트와 연결되어야 하는 오른쪽

www.acmicpc.net

 

 

풀이

최대한 많은 시그널을 교차하지 않도록 연결해야 하므로 연결되는 포트의 번호가 증가하는 순서대로 많이 연결할 수 있도록 해야 한다. 따라서 이 문제는 가장 긴 증가하는 부분 수열의 크기를 구하는 문제다.

 

N의 범위는 4 × 10^4이므로 시간복잡도가 O(N^2) 알고리즘으로 풀면 시간초과가 나므로 시간복잡도가 O(NlogN)인 알고리즘으로 풀어야 한다. O(NlogN)으로 푸는 법은 아래 링크에 설명되어 있다.

[12015번 가장 긴 증가하는 부분 수열 2 문제] | [12015번 가장 긴 증가하는 부분 수열 2 풀이]

 

 

코드

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

int main() {
  ios::sync_with_stdio(false);
  cin.tie(NULL);
  int t;
  cin >> t;
  while (t--) {
    int n, x;
    cin >> n >> x;
    vector<int> v{x};
    for (int i = 1; i < n; i++) {
      cin >> x;
      if (v.back() < x)
        v.push_back(x);
      else
        *lower_bound(v.begin(), v.end(), x) = x;
    }
    cout << v.size() << '\n';
  }
  return 0;
}
728x90
반응형