Advertisement
tuki2501

DPLIS4

Mar 30th, 2020
229
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.82 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define lb lower_bound
  5. #define vi vector<int>
  6. #define ii pair<int,int>
  7. #define fi first
  8. #define sc second
  9.  
  10. const int N = 200001;
  11.  
  12. int n, m;
  13.  
  14. ii a[N];
  15. set<int> s;
  16. vi bit[N], node[N];
  17.  
  18. void compress() {
  19.     vector<int> v(s.begin(), s.end());
  20.     for (int i = 1; i <= n; i++) {
  21.         a[i].fi = lower_bound(v.begin(), v.end(), a[i].fi) - v.begin() + 1;
  22.         a[i].sc = lower_bound(v.begin(), v.end(), a[i].sc) - v.begin() + 1;
  23.     }
  24. }
  25.  
  26. void fakeupd(int i, int j) {
  27.     for (; i <= m; i += i & -i) {
  28.         node[i].push_back(j);
  29.     }
  30. }
  31.  
  32. void fakeget(int i, int j) {
  33.     for (; i >= 1; i -= i & -i) {
  34.         node[i].push_back(j);
  35.     }
  36. }
  37.  
  38. void upd(int u, int v, int t) {
  39.     for (int i = u; i <= m; i += i & -i) {
  40.         int j = lb(node[i].begin(), node[i].end(), v) - node[i].begin();
  41.         for (; j < (int) node[i].size(); j += j & -j) {
  42.             bit[i][j] = max(bit[i][j], t);
  43.         }
  44.     }
  45. }
  46.  
  47. int get(int u, int v) {
  48.     int t = 0;
  49.     for (int i = u; i >= 1; i -= i & -i) {
  50.         int j = lb(node[i].begin(), node[i].end(), v) - node[i].begin();
  51.         for (; j >= 1; j -= j & -j) {
  52.             t = max(t, bit[i][j]);
  53.         }
  54.     }
  55.     return t;
  56. }
  57.  
  58. int main() {
  59.     ios::sync_with_stdio(0); cin.tie(0);
  60.     cin >> n;
  61.     for (int i = 1; i <= n; i++) {
  62.         cin >> a[i].fi >> a[i].sc;
  63.         s.insert(a[i].fi); s.insert(a[i].sc);
  64.     }
  65.     compress(); m = s.size();
  66.     for (int i = 1; i <= m; i++) {
  67.         node[i].push_back(-1);
  68.     }
  69.     for (int i = 1; i <= n; i++) {
  70.         fakeget(a[i].fi, a[i].sc);
  71.         fakeupd(a[i].fi + 1, a[i].sc + 1);
  72.     }
  73.     for (int i = 1; i <= m; i++) {
  74.         sort(node[i].begin(), node[i].end());
  75.         bit[i].resize(node[i].size());
  76.     }
  77.     int ans = 0;
  78.     for (int i = 1; i <= n; i++) {
  79.         int t = get(a[i].fi, a[i].sc) + 1;
  80.         upd(a[i].fi + 1, a[i].sc + 1, t);
  81.         ans = max(ans, t);
  82.     }
  83.     cout << ans << '\n';
  84. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement