Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* Wrong Answer */
- #include <algorithm>
- #include <bitset>
- #include <cctype>
- #include <cmath>
- #include <complex>
- #include <cstdio>
- #include <cstdlib>
- #include <cstring>
- #include <ctime>
- #include <deque>
- #include <fstream>
- #include <iostream>
- #include <list>
- #include <climits>
- #include <map>
- #include <memory>
- #include <queue>
- #include <set>
- #include <sstream>
- #include <stack>
- #include <string>
- #include <utility>
- #include <vector>
- #include <iomanip>
- using namespace std;
- #define REP(i,n) for(__typeof(n) i=0; i<(n); i++)
- #define FOR(i,a,b) for(__typeof(b) i=(a); i<=(b); i++)
- #define RFOR(i,a,b) for(__typeof(b) i=(a); i>(b); i--)
- #define RESET(t,value) memset((t), value, sizeof(t))
- #define READ(f) freopen(f, "r", stdin)
- #define pb push_back
- #define Range 100000
- int dp[Range];
- vector <int> x;
- int pos;
- int I[Range];
- int LisNlogk() {
- int i;
- memset(I, INF, sizeof I);
- I[0] = -INF;
- int trackPosition = 0;
- int max = -1000;
- REP(i, x.size()) {
- int begin, end, mid;
- begin = 0;
- end = trackPosition;
- while( begin <= end ) {
- mid = ( begin + end ) / 2;
- if( I[mid] < x[i] )
- begin = mid + 1;
- else
- end = mid - 1;
- }
- // observe the binary search carefully, when the binary search ends
- // begin > end and we put our item in I[begin]
- I[begin] = x[i];
- dp[i] = begin; // storing the LIS of every position
- if(dp[i] > max) { // track the last index for later reconstruct the sequence
- max = dp[i];
- pos = i;
- }
- if( trackPosition < begin )
- trackPosition = begin;
- }
- return trackPosition;
- }
- vector <int> listSequence;
- void sequence() {
- listSequence.clear();
- listSequence.pb(x[pos]);
- for(int i = pos-1; i >= 0; i--) {
- if(dp[i] == dp[pos] -1) {
- pos = i;
- listSequence.pb(x[i]);
- }
- if(dp[i] == 1) break;
- }
- reverse(listSequence.begin(), listSequence.end());
- REP(i, listSequence.size()) cout << listSequence[i] << "\n";
- }
- int main() {
- //READ("inputs.txt");
- int value;
- while (cin >> value) x.pb(value);
- cout << LisNlogk() << "\n-\n";
- sequence();
- return EXIT_SUCCESS;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement