Advertisement
a_pramanik

nlogn lis

Mar 14th, 2017
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.32 KB | None | 0 0
  1. ///:-)
  2. #include <bits/stdc++.h>
  3. #define pb push_back
  4. #define ll long long int
  5. #define inf 2000000000
  6. #define infLL 9000000000000000000
  7. #define infULL 18446744073709551615
  8. #define Aktaruzzaman using
  9. #define pi (2.0*acos(0.0))
  10. #define Pramanik namespace std;
  11. #define vsort(v)   sort(v.begin(),v.end())
  12. #define ull unsigned long long int
  13. #define mem(a, b) memset(a, b, sizeof a)
  14. #define cf 1000002
  15. #define MOD 1000000007
  16. #define pii pair<int, int>
  17.  
  18. //int dx[]={0,1,0,-1};
  19. //int dy[]={1,0,-1,0};
  20. //int dx[]={1,1,0,-1,-1,-1,0,1};
  21. //int dy[]={0,1,1,1,0,-1,-1,-1};
  22.  
  23. template <class T> inline T gcd(T a,T b){if(b==0)return a;return gcd(b,a%b);}
  24. template< class T > inline T lcm(T a,T b) {a=abs(a);b=abs(b); return (a/gcd(a,b))*b;}
  25. template <class T> inline T is_prime(T a){if(a<2|a==4)return false;if(a==2||a==3||a==5)return true; T g=(T)sqrt(a)+1; for(T i=2; i<=g; i++){if(a%i==0)return false;}return false;}
  26. template <class T> inline T bigmod(T n,T p,T m){if(p==0)return 1; if(p%2)return ((n%m)*bigmod(n,p-1,m))%m; else {T c=bigmod(n,p/2,m);return ((c%m)*(c%m))%m;}}
  27.  
  28. Aktaruzzaman Pramanik
  29.  
  30. int a[cf], tailInd[cf], prev[cf];
  31. int n;
  32. stack<int>st;
  33. int bs(int st, int en, int val)
  34. {
  35.     int lo=st, hi = en, p;
  36.  
  37.     while(lo<=hi){
  38.         int mid = (lo+hi)/2;
  39.  
  40.         if(a[tailInd[mid]]>=val){
  41.             p = mid;
  42.             hi=mid-1;
  43.         }
  44.         else lo=mid+1;
  45.  
  46.     }
  47.     return p;
  48. }
  49.  
  50. int getLis()
  51. {
  52.     int len = 1;
  53.     int i;
  54.     for(i=1; i<n; i++){
  55.  
  56.         if(a[i]<a[tailInd[0]]){
  57.             tailInd[0]=i;
  58.         }
  59.  
  60.         else if(a[i]>a[tailInd[len-1]]){
  61.             prev[i] = tailInd[len-1];
  62.             tailInd[len++]=i;
  63.         }
  64.  
  65.         else{
  66.  
  67.             int pos = bs(0, len-1, a[i]);
  68.  
  69.             prev[i] = tailInd[pos-1];
  70.             tailInd[pos]=i;
  71.  
  72.         }
  73.  
  74.     }
  75.  
  76.      i = tailInd[len-1];
  77.  
  78.      while(1){
  79.         st.push(a[i]);
  80.         if(prev[i]<0)break;
  81.         i=prev[i];
  82.      }
  83.  
  84.     return len;
  85.  
  86. }
  87.  
  88. int main()
  89.  
  90. {
  91.   /*ios_base:: sync_with_stdio(0);
  92.     cin.tie(NULL);
  93.     cout.tie(NULL);*/
  94.  
  95.     int i, j, k;
  96.  
  97.     scanf("%d", &n);
  98.  
  99.     for(i=0; i<n; i++)scanf("%d", &a[i]);
  100.     mem(tailInd, 0);
  101.     mem(prev, -1);
  102.  
  103.  
  104.     int len = getLis();
  105.  
  106.     cout<<"Size : "<<len<<endl;
  107.  
  108.     while(!st.empty()){
  109.         cout<<st.top()<<" ";
  110.         st.pop();
  111.     }
  112.     cout<<endl;
  113.  
  114. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement