Advertisement
Guest User

Untitled

a guest
Oct 9th, 2014
362
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.72 KB | None | 0 0
  1. #include <vector>
  2. #include <algorithm>
  3. #include <cstdio>
  4.  
  5. using namespace std;
  6.  
  7. int A[111111];
  8. int D[111111];
  9. int P[111111];
  10. int T[4444444];
  11.  
  12. int query(int v, int tl, int tr, int l, int r) {
  13.   if (l > r) return 111110;
  14.   if (tl == l && tr == r) return T[v];
  15.   int mm = (tl+tr)/2;
  16.   int q1 = query(2*v+1, tl, mm, l, min(mm,r));
  17.   int q2 = query(2*v+2, mm+1, tr, max(mm+1,l), r);
  18.   if (D[q1] > D[q2]) return q1;
  19.   return q2;
  20. }
  21.  
  22. void update(int v, int tl, int tr, int pos, int x) {
  23.   if (tl == tr) {
  24.     T[v] = x;
  25.   } else {
  26.     int mm = (tl+tr)/2;
  27.     if (pos <= mm) {
  28.       update(2*v+1, tl, mm, pos, x);
  29.     } else {
  30.       update(2*v+2, mm+1, tr, pos, x);
  31.     }
  32.     int q1 = T[2*v+1], q2 = T[2*v+2];
  33.     T[v] = (D[q1] > D[q2]) ? q1 : q2;
  34.   }
  35. }
  36.  
  37. int main(void) {
  38.   int n;
  39.   int ans = 1, st = 0;
  40.   freopen("input.txt", "rt", stdin);
  41.   freopen("output.txt", "wt", stdout);
  42.   D[111110] = -1000000;
  43.   for (int i = 0; i < 111111; i++) { D[i] = -1000000000; P[i] = 111110; }
  44.   for (int i = 0; i < 4444444; i++) { T[i] = 111110; }
  45.   cin >> n;
  46.   for (int i = 0; i < n; i++) {
  47.     cin >> A[i];
  48.   }
  49.   for (int i = 0; i < n; i++) {
  50.     int mx1 = query(1,0,1000000,0,A[i]-2);
  51.     int mx2 = query(1,0,1000000,A[i]+2,1000000);
  52.     int mx3 = query(1,0,1000000,A[i],A[i]);
  53.     if (D[mx2] > D[mx1]) mx1 = mx2;
  54.     if (D[mx3] > D[mx1]) mx1 = mx3;
  55.     D[i] = max(D[mx1],0) + 1;
  56.     P[i] = mx1;
  57.     update(1,0,1000000,A[i],i);
  58.     if (D[i] > ans) {
  59.       ans = D[i];
  60.       st = i;
  61.     }
  62.   }
  63.   cout << n-ans << endl;
  64.   vector<int> R;
  65.   while (st != 111110) {
  66.     R.push_back(A[st]);
  67.     st = P[st];
  68.   }
  69.   for (int i = (int)R.size()-1; i >= 0; i--) {
  70.     cout << R[i] << " ";
  71.   }
  72.   cout << endl;
  73.   return 0;
  74. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement