Monday, May 20, 2019

[Codeforces] E. LIS of Sequence

Author            : Dipu Kumar Mohanto 
                    CSE, Batch - 6
                    BRUR.
Problem Statement : E. LIS of Sequence
Source            : Codeforces
Category          : Dynamic Programing
Algorithm         : LIS
Verdict           : Accepted

  1. #include <bits/stdc++.h>  
  2.   
  3. using namespace std;  
  4.   
  5. //#define int                 long long int  
  6. #define pii                 pair <int, int>  
  7.   
  8. static const int maxn = 2e5 + 5;  
  9. static const int logn = 20;  
  10.   
  11. int arr[maxn], lis_size[maxn], ans[maxn];  
  12. set <pii> myset[maxn];  
  13.   
  14. void lis(int n)  
  15. {  
  16.       vector <int> vec;  
  17.       for (int i = 1; i <= n; i++)  
  18.       {  
  19.             int x = arr[i];  
  20.             auto it = lower_bound(vec.begin(), vec.end(), x);  
  21.             lis_size[i] = int(it - vec.begin()) + 1;  
  22.             if (it == vec.end()) vec.push_back(x);  
  23.             else *it = x;  
  24.       }  
  25. }  
  26.   
  27. signed main()  
  28. {  
  29.       ios_base::sync_with_stdio(false);  
  30.       cin.tie(nullptr);  
  31.       cout.tie(nullptr);  
  32.   
  33.       #ifndef ONLINE_JUDGE  
  34.             freopen("in.txt""r", stdin);  
  35.       #endif // ONLINE_JUDGE  
  36.   
  37.       int n;  
  38.       cin >> n;  
  39.       for (int i = 1; i <= n; i++) cin >> arr[i];  
  40.   
  41.       lis(n);  
  42.   
  43.       int max_lis = 0;  
  44.       int ind = 0;  
  45.       for (int i = 1; i <= n; i++)  
  46.       {  
  47.             if (lis_size[i] >= max_lis) max_lis = lis_size[i], ind = i;  
  48.       }  
  49.   
  50.       fill(begin(ans), end(ans), 1);  
  51.   
  52.       for (int i = ind; i >= 1; i--)  
  53.       {  
  54.             int sze = lis_size[i];  
  55.             if (sze == max_lis)  
  56.             {  
  57.                   myset[sze].insert(pii(arr[i], i));  
  58.             }  
  59.             else  
  60.             {  
  61.                   auto it = myset[sze+1].lower_bound(pii(arr[i] + 1, -1));  
  62.                   if (it != myset[sze+1].end()) myset[sze].insert(pii(arr[i], i));  
  63.             }  
  64.       }  
  65.       for (int i = 1; i <= n; i++)  
  66.       {  
  67.             int sze = lis_size[i];  
  68.             auto it = myset[sze].find(pii(arr[i], i));  
  69.             if (it != myset[sze].end())  
  70.             {  
  71.                   if (myset[sze].size() == 1) ans[i] = 3;  
  72.                   else ans[i] = 2;  
  73.             }  
  74.       }  
  75.       for (int i = 1; i <= n; i++) cout << ans[i];  
  76. }  

No comments:

Post a Comment

Note: Only a member of this blog may post a comment.