Advertisement
loulett

HW3_lis

Dec 22nd, 2014
168
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.10 KB | None | 0 0
  1. #include <cstdio>
  2. #include <cstdlib>
  3.  
  4. int find_lis(int* a, int* b, int n)
  5. {
  6.     int* p = (int*)malloc(n*sizeof(int));
  7.     int u = 0, v = 0, j = 0;
  8.     b[0] = 0;
  9.  
  10.     for (int i = 1; i < n; i++)
  11.     {
  12.         if (a[b[j]] < a[i])
  13.         {
  14.             p[i] = b[j];
  15.             j++;
  16.             b[j] = i;
  17.             continue;
  18.         }
  19.         for (u = 0, v = j; u < v;)
  20.         {
  21.             int c = (u + v) / 2;
  22.             if (a[b[c]] < a[i])
  23.                 u=c+1;
  24.             else
  25.                 v=c;
  26.         }
  27.         if (a[i] < a[b[u]])
  28.         {
  29.             if (u > 0)
  30.                 p[i] = b[u-1];
  31.             b[u] = i;
  32.         }
  33.     }
  34.  
  35.     for (u = j + 1, v = b[j]; u--; v = p[v])
  36.         b[u] = v;
  37.  
  38.     return j;
  39. }
  40.  
  41.  
  42. int main()
  43. {
  44.     int n = 0;
  45.     scanf("%d", &n);
  46.     int* arr = (int*)malloc(n*sizeof(int));
  47.     for (int i = 0; i < n; i++)
  48.         scanf("%d", &seq[i]);
  49.     int* lis = (int*)malloc(n*sizeof(int));
  50.     int j = find_lis(arr, lis, n);
  51.  
  52.     for (size_t i = 0; i <= j; i++)
  53.         printf("%d ", arr[lis[i]]);
  54.     printf("\n");
  55.  
  56.     return 0;
  57. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement