Advertisement
Kaidul

uva - 481

Jan 31st, 2013
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.32 KB | None | 0 0
  1. /* Wrong Answer */
  2. #include <algorithm>
  3. #include <bitset>
  4. #include <cctype>
  5. #include <cmath>
  6. #include <complex>
  7. #include <cstdio>
  8. #include <cstdlib>
  9. #include <cstring>
  10. #include <ctime>
  11. #include <deque>
  12. #include <fstream>
  13. #include <iostream>
  14. #include <list>
  15. #include <climits>
  16. #include <map>
  17. #include <memory>
  18. #include <queue>
  19. #include <set>
  20. #include <sstream>
  21. #include <stack>
  22. #include <string>
  23. #include <utility>
  24. #include <vector>
  25. #include <iomanip>
  26.  
  27. using namespace std;
  28.  
  29. #define REP(i,n) for(__typeof(n) i=0; i<(n); i++)
  30. #define FOR(i,a,b) for(__typeof(b) i=(a); i<=(b); i++)
  31. #define RFOR(i,a,b) for(__typeof(b) i=(a); i>(b); i--)
  32. #define RESET(t,value) memset((t), value, sizeof(t))
  33.  
  34. #define READ(f) freopen(f, "r", stdin)
  35. #define pb push_back
  36.  
  37. #define Range 100000
  38.  
  39. int dp[Range];
  40. vector <int> x;
  41. int pos;
  42. int I[Range];
  43.  
  44. int LisNlogk() {
  45.     int i;
  46.     memset(I, INF, sizeof I);
  47.     I[0] = -INF;
  48.  
  49.     int trackPosition = 0;
  50.     int max = -1000;
  51.     REP(i, x.size()) {
  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.         // observe the binary search carefully, when the binary search ends
  63.         // begin > end and we put our item in I[begin]
  64.         I[begin] = x[i];
  65.         dp[i] = begin; // storing the LIS of every position
  66.         if(dp[i] > max) { // track the last index for later reconstruct the sequence
  67.             max = dp[i];
  68.             pos = i;
  69.         }
  70.         if( trackPosition < begin )
  71.             trackPosition = begin;
  72.     }
  73.     return trackPosition;
  74. }
  75.  
  76. vector <int> listSequence;
  77. void sequence() {
  78.     listSequence.clear();
  79.     listSequence.pb(x[pos]);
  80.     for(int i = pos-1; i >= 0; i--) {
  81.         if(dp[i] == dp[pos] -1) {
  82.             pos = i;
  83.             listSequence.pb(x[i]);
  84.         }
  85.         if(dp[i] == 1) break;
  86.     }
  87.  
  88.     reverse(listSequence.begin(), listSequence.end());
  89.     REP(i, listSequence.size()) cout << listSequence[i] << "\n";
  90. }
  91.  
  92. int main() {
  93.     //READ("inputs.txt");
  94.     int value;
  95.     while (cin >> value) x.pb(value);
  96.     cout << LisNlogk() << "\n-\n";
  97.     sequence();
  98.     return EXIT_SUCCESS;
  99. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement