Advertisement
Guest User

Untitled

a guest
Sep 23rd, 2019
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.06 KB | None | 0 0
  1. //LIS in any partially ordered domain
  2. //https://www.quora.com/How-can-the-SPOJ-problem-LIS2-be-solved
  3. //https://csit.am/2009/proceedings/2DMCA/5.pdf
  4. //https://core.ac.uk/download/pdf/82062831.pdf
  5. #include <iostream>
  6. #include <map>
  7. using namespace std;
  8.  
  9. struct NiceDay{
  10.     map<int,int> M;
  11.     bool find(int x, int y){
  12.         map<int,int>::iterator lb = M.lower_bound(x);
  13.         if (lb == M.begin())
  14.             return false;
  15.         lb--;
  16.         if (lb->second < y)
  17.             return true;
  18.         else
  19.             return false;
  20.     }
  21.     void add(int x, int y){
  22.         map<int,int>::iterator lb = M.lower_bound(x);
  23.         map<int,int>::iterator i2 = lb;
  24.         while (i2 != M.end() && i2->second >= y)
  25.             i2++;
  26.         M.erase(lb,i2);
  27.         M.insert(pair<int,int>(x,y));
  28.     }
  29. };
  30. int main(){
  31.     static NiceDay a[100010];
  32.     int N, x, y;
  33.     cin >> N >> x >> y;
  34.     a[1].add(x,y);
  35.     int L = 1;
  36.     for(int i = 0; i < N-1; ++i){
  37.         cin >> x >> y;
  38.         int l = 0;
  39.         int u = L;
  40.         int m = 0;
  41.         while(u > l){
  42.             m = (l+u+1)/2;
  43.             if(a[m].find(x,y))
  44.                 l = m;
  45.             else
  46.                 u = m-1;
  47.         }
  48.         if (L <= l)
  49.             L = l+1;
  50.         a[l+1].add(x,y);
  51.     }
  52.     printf("%d\n", L);
  53. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement