BOJ 2995 - 생일

image.png

LIS 문제 특) 풀다가 LIS인걸 알아차림

역추적도 같이 해줘야한다.

놀랍게도(?) LIS는 일차원 배열이 아닌 pair 같은 것에 대해서도 적용할 수 있는 문제들이 종종 있다.

$(s,e)$ 를 $e$ 가 작은 순으로, $e$가 같다면 $s$ 가 큰 순으로 정렬한다고 하자.

그럼 $s$ 에 대한 LDS 문제가 된다.

$-s$에 대해 LIS를 해주자

이걸 구한 뒤 역추적 해주면 된다.

LIS 문제인데 중복된 수를 포함하는 LIS로 구현해줘야 함에 유의한다.

const int MAX = 1e6;  
void solve() {  
   int n;  
   cin >> n;  
   vector<pi> a(n);  
   for (auto &[l, r]: a) cin >> l >> r;  
   sort(all(a), [&](auto l, auto r) {  
      if (l.se != r.se) return l.se < r.se;  
      return l.fi > r.fi;  
   });  
   vi v, lis(n);  
   for (int i = 0; i < n; i++) {  
      auto &[l, r] = a[i];  
      int j = ubi(v, -l);  
      if (j == sz(v)) v.pb(-l);  
      else v[j] = -l;  
      lis[i] = j;  
   }  
   cout << sz(v) << endl;  
   int cur = sz(v) - 1;  
   for (int i = n; i-->0;)   
      if (cur == lis[i]) cout << a[i].fi << ' ' << a[i].se << '\n', cur--;  
}

Tags:

Categories:

Updated:

Comments