Advertisement
Kaidul

10534

Feb 1st, 2013
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.30 KB | None | 0 0
  1. #include <algorithm>
  2. #include <bitset>
  3. #include <cctype>
  4. #include <cmath>
  5. #include <complex>
  6. #include <cstdio>
  7. #include <cstdlib>
  8. #include <cstring>
  9. #include <ctime>
  10. #include <deque>
  11. #include <fstream>
  12. #include <iostream>
  13. #include <list>
  14. #include <climits>
  15. #include <map>
  16. #include <memory>
  17. #include <queue>
  18. #include <set>
  19. #include <sstream>
  20. #include <stack>
  21. #include <string>
  22. #include <utility>
  23. #include <vector>
  24. #include <iomanip>
  25.  
  26. using namespace std;
  27.  
  28. #define REP(i,n) for(__typeof(n) i=0; i<(n); i++)
  29. #define FOR(i,a,b) for(__typeof(b) i=(a); i<=(b); i++)
  30. #define RESET(t,value) memset((t), value, sizeof(t))
  31.  
  32. #define READ(f) freopen(f, "r", stdin)
  33.  
  34. #define INF (1<<30)
  35. #define pb push_back
  36.  
  37. #define Range 10010
  38.  
  39. int dp[Range], L[Range];
  40. int x[Range];
  41. int I[Range];
  42. int pos, N;
  43. vector <int> listSequence, ldSequence;
  44. void LisNlogk() {
  45.     int i;
  46.     memset(I, INF, sizeof I);
  47.     I[0] = -INF;
  48.  
  49.     int trackPosition = 0;
  50.     int max = -INF;
  51.     for(i = 0; i <= N; i++ ) {
  52.         int begin, end, mid;
  53.         begin = 0;
  54.         end = trackPosition;
  55.         while( begin <= end ) {
  56.             mid = ( begin + end ) / 2;
  57.             if( I[mid] < x[i] )
  58.                 begin = mid + 1;
  59.             else
  60.                 end = mid - 1;
  61.         }
  62.         I[begin] = x[i];
  63.         dp[i] = begin;
  64.         if(dp[i] > max) {
  65.             max = dp[i];
  66.             pos = i;
  67.         }
  68.         if( trackPosition < begin )
  69.             trackPosition = begin;
  70.     }
  71. }
  72.  
  73. void sequence() {
  74.     listSequence.clear();
  75.     listSequence.pb(x[pos]);
  76.     for(int i = pos-1; i >= 0; i--) {
  77.         if( x[i] < x[pos] &&  dp[i] == dp[pos] -1) {
  78.             pos = i;
  79.             listSequence.pb(x[i]);
  80.         }
  81.     }
  82. }
  83.  
  84. void LdsNlogk() {
  85.     int i;
  86.     memset(I, -INF, sizeof I);
  87.     I[0] = INF;
  88.  
  89.     int trackPosition = 0;
  90.     int Max = -INF;
  91.     for(i = 0; i <= N; i++ ) {
  92.         int begin, end, mid;
  93.         begin = 0;
  94.         end = trackPosition;
  95.         while( begin <= end ) {
  96.             mid = ( begin + end ) / 2;
  97.             if( I[mid] > x[i] )
  98.                 begin = mid + 1;
  99.             else
  100.                 end = mid - 1;
  101.         }
  102.         I[begin] = x[i];
  103.         dp[i] = begin;
  104.         if(dp[i] > Max) {
  105.             Max = dp[i];
  106.             pos = i;
  107.         }
  108.         if( trackPosition < begin )
  109.             trackPosition = begin;
  110.     }
  111. }
  112.  
  113. void decreasingSeq() {
  114.     ldSequence.clear();
  115.     ldSequence.pb(x[pos]);
  116.     for(int i = pos-1; i >= 0; i--) {
  117.         if( x[i] > x[pos] &&  dp[i] == dp[pos] - 1) {
  118.             pos = i;
  119.             ldSequence.pb(x[i]);
  120.         }
  121.     }
  122. }
  123.  
  124. int main() {
  125.     //READ("inputs.txt");
  126.     int n;
  127.     while (cin >> n) {
  128.         REP(i, n) cin >> x[i];
  129.         N = n - 1;
  130.         LdsNlogk();
  131.         decreasingSeq();
  132.         LisNlogk();
  133.         sequence();
  134.         int result = -1;
  135.         reverse(listSequence.begin(), listSequence.end());
  136.         for(int i = listSequence.size() - 1; i >= 0; i--) {
  137.             REP( j, ldSequence.size() ) {
  138.                 if(listSequence[i] == ldSequence[j]) {
  139.                     result = (i+1) * 2 - 1;
  140.                     break;
  141.                 }
  142.             }
  143.             if(result != -1) break;
  144.         }
  145.         cout << result << "\n";
  146.     }
  147.  
  148.     return EXIT_SUCCESS;
  149. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement