SuitNdtie

Run O(nlogn)

Apr 23rd, 2019
220
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.65 KB | None | 0 0
  1. #include<stdio.h>
  2.  
  3. int main()
  4. {
  5.     int n;
  6.     scanf("%d",&n);
  7.     int arr[n+1];
  8.     int lis[n+1];
  9.     for(int i = 1 ; i <= n ; i ++){
  10.         scanf("%d",&arr[i]);
  11.     }
  12.     int maxa = 1;
  13.     lis[1] = arr[1];
  14.     int ansfor[n+1];
  15.     ansfor[1] = 1;
  16.     for(int i = 2 ; i <= n ; i++){
  17.         if(arr[i] <= lis[1]){
  18.             lis[1] = arr[i];
  19.             ansfor[i] = 1;
  20.         }
  21.         else if(arr[i] > lis[maxa]){
  22.             lis[++maxa] = arr[i];
  23.             ansfor[i] = maxa;
  24.         }
  25.         else{
  26.             int l = 1 , r = maxa - 1;
  27.             int pos = 1;
  28.             while(l <= r){
  29.                 int m = (l+r)/2;
  30.                 if(lis[m] < arr[i]){
  31.                     pos = m;
  32.                     l = m + 1;
  33.                 }
  34.                 else{
  35.                     r = m - 1;
  36.                 }
  37.             }
  38.             lis[pos+1] = arr[i];
  39.             ansfor[i] = pos + 1;
  40.         }
  41.     }/*
  42.     for(int i = 1 ; i <= n ;i ++){
  43.         printf("%d ",ansfor[i]);
  44.     }
  45.     printf("\n");
  46.     */
  47.     int arrrev[n+1];for(int i = n ; i >= 1 ; i --)arrrev[n - i + 1] = arr[i];
  48.     int maxr = 1;
  49.     int lisrev[n+1];
  50.     int ansrev[n+1];
  51.     lisrev[maxr] = arrrev[1];
  52.     ansrev[1] = 1;
  53.     for(int i = 1 ; i <= n ; i ++){
  54.     //  printf("%d ",arrrev[i]);
  55.         if(arrrev[i] <= lisrev[1]){
  56.             lisrev[1] = arrrev[i];
  57.             ansrev[i] = 1;
  58.         }
  59.         else if(arrrev[i] > lisrev[maxr]){
  60.             lisrev[++maxr] = arrrev[i];
  61.             ansrev[i] = maxr;
  62.         }
  63.         else{
  64.             int l = 1 , r = maxr - 1;
  65.             int pos = 1;
  66.             while(l <= r){
  67.                 int m = (l+r)/2;
  68.                 if(lisrev[m] < arrrev[i]){
  69.                     pos = m;
  70.                     l = m + 1;
  71.                 }
  72.                 else{
  73.                     r = m - 1;
  74.                 }
  75.             }
  76.             lisrev[pos+1] = arrrev[i];
  77.             ansrev[i] = pos+1;
  78.         }
  79.     }
  80.     int ansback[n+1];
  81.     int ans = 1;
  82.     for(int i = 1 ; i <= n ; i ++){
  83.         ansback[i] = ansrev[n-i+1];
  84.     //  printf("%d ",ansback[i]);
  85.         int sum = ansfor[i] + ansback[i] - 1;
  86.         if(sum > ans)ans = sum;
  87.     }
  88.     printf("%d",ans);
  89.     return 0;
  90. }
Advertisement
Add Comment
Please, Sign In to add comment