Advertisement
iroodaz

F - The Monochrome Picture

Oct 9th, 2014
337
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.08 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <iostream>
  3. #include <iomanip>
  4. #include <cstdio>
  5. #include <string>
  6. #include <cmath>
  7. #include <limits>
  8. #include <algorithm>
  9. #include <vector>
  10. #include <queue>
  11. #include <cstring>
  12. #include <set>
  13. #include <ctime>
  14. #include <stack>
  15. #include <map>
  16. #include <unordered_map>
  17. #include <unordered_set>
  18.  
  19. using namespace std;
  20. #define inf 2147483647
  21. #define eps 0.0000000001
  22. #define e  2.718281828459
  23. #define mod 1000000007
  24. #define LL long long
  25. #define ULL unsigned long long
  26. const double pi = acos(0.0)*2.0;
  27.  
  28. //  memset(array, value, sizeof(array));
  29. //  cout<<fixed<<setprecision(3)<<"\nExecution time="<<clock()/1000.0<<endl;
  30. //  freopen("input.txt","r",stdin);
  31. //  freopen("output.txt","w",stdout);
  32.  
  33.  
  34. set <pair<int, int> > st;
  35. int lng[1000100], ind[1000100], prv[100100], ans[100100], A[100100];
  36.  
  37. int main()
  38. {
  39.     freopen("input.txt", "r", stdin);
  40.     freopen("output.txt", "w", stdout);
  41.     int i, j, k, n, m;
  42.     for(i = 0; i <= 1000001; i++)
  43.     {
  44.         lng[i] = -10000;
  45.         ind[i] = -10000;
  46.     }
  47.     lng[i] = 0;
  48.     ind[i] = -1;
  49.     st.insert({ 0, 1000002 });
  50.     scanf(" %d", &n);
  51.     int best = 0, bestind = -1;
  52.     for(i = 0; i < n; i++)
  53.     {
  54.         scanf(" %d", A + i);
  55.  
  56.         auto it1 = st.find({ lng[A[i] + 1], A[i] + 1 });
  57.         if(it1 != st.end())
  58.             st.erase(it1);
  59.  
  60.         auto it2 = st.find({ lng[A[i] - 1], A[i] - 1 });
  61.         if(it2 != st.end())
  62.             st.erase(it2);
  63.  
  64.         auto cur = *(st.rbegin());
  65.         prv[i] = ind[cur.second];
  66.         ans[i] = cur.first + 1;
  67.         if(ans[i]>best)
  68.         {
  69.             best = ans[i];
  70.             bestind = i;
  71.         }
  72.  
  73.         auto it3 = st.find({ lng[A[i]], A[i] });
  74.         if(it3 != st.end())
  75.             st.erase(it3);
  76.  
  77.         ind[A[i]] = i;
  78.         lng[A[i]] = ans[i];
  79.  
  80.         if(lng[A[i] - 1] >= 0)
  81.             st.insert({ lng[A[i] - 1], A[i] - 1 });
  82.         if(lng[A[i] + 1] >= 0)
  83.             st.insert({ lng[A[i] + 1], A[i] + 1 });
  84.         st.insert({ lng[A[i]], A[i] });
  85.     }
  86.     printf("%d\n", n - best);
  87.     stack <int> stk;
  88.     while(bestind >= 0)
  89.     {
  90.         stk.push(A[bestind]);
  91.         bestind = prv[bestind];
  92.     }
  93.     printf("%d", stk.top());
  94.     stk.pop();
  95.     while(!stk.empty())
  96.     {
  97.         printf(" %d", stk.top());
  98.         stk.pop();
  99.     }
  100.     printf("\n");
  101. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement