Hezov

LIS in O(NlogN)

Nov 5th, 2025
496
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 0.85 KB | None | 0 0
  1. // Subsir crescator de lungime maxima in O(NlogN)
  2. #include <iostream>
  3. using namespace std;
  4. const int mxN = 2e5, INF = 2e9;
  5. // dp[i] - cea mai mica valoare in care se termina un subsir crescator de lungime i
  6. int v[mxN+10], dp[mxN+10];
  7. int main()
  8. {
  9.     int n ;
  10.     cin >> n ;
  11.     dp[0] = -INF;
  12.     for(int i = 1;i<=n;i++)
  13.         cin >> v[i], dp[i] = INF;
  14.     for(int poz = 1;poz<=n;poz++)
  15.     {
  16.         int st = 0, dr = n-1 , mid, sol = -1;
  17.         while(st <= dr)
  18.         {
  19.             mid = (st + dr) / 2;
  20.             if(v[poz] <= dp[mid])
  21.                 dr = mid-1;
  22.             else st = mid+1, sol = mid;
  23.  
  24.         }
  25.         dp[sol+1] = min(dp[sol+1],v[poz]);
  26.     }
  27.     int sol = 0;
  28.     for(int i = 1;i<=n;i++)
  29.     {
  30.         if(dp[i] != INF)
  31.             sol = i;
  32.         else break;
  33.     }
  34.     cout << sol << '\n';
  35.     return 0;
  36. }
  37.  
Advertisement
Add Comment
Please, Sign In to add comment