Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #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 RESET(t,value) memset((t), value, sizeof(t))
- #define READ(f) freopen(f, "r", stdin)
- #define INF (1<<30)
- #define pb push_back
- #define Range 10010
- int dp[Range], L[Range];
- int x[Range];
- int I[Range];
- int pos, N;
- vector <int> listSequence, ldSequence;
- void LisNlogk() {
- int i;
- memset(I, INF, sizeof I);
- I[0] = -INF;
- int trackPosition = 0;
- int max = -INF;
- for(i = 0; i <= N; i++ ) {
- 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;
- }
- I[begin] = x[i];
- dp[i] = begin;
- if(dp[i] > max) {
- max = dp[i];
- pos = i;
- }
- if( trackPosition < begin )
- trackPosition = begin;
- }
- }
- void sequence() {
- listSequence.clear();
- listSequence.pb(x[pos]);
- for(int i = pos-1; i >= 0; i--) {
- if( x[i] < x[pos] && dp[i] == dp[pos] -1) {
- pos = i;
- listSequence.pb(x[i]);
- }
- }
- }
- void LdsNlogk() {
- int i;
- memset(I, -INF, sizeof I);
- I[0] = INF;
- int trackPosition = 0;
- int Max = -INF;
- for(i = 0; i <= N; i++ ) {
- 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;
- }
- I[begin] = x[i];
- dp[i] = begin;
- if(dp[i] > Max) {
- Max = dp[i];
- pos = i;
- }
- if( trackPosition < begin )
- trackPosition = begin;
- }
- }
- void decreasingSeq() {
- ldSequence.clear();
- ldSequence.pb(x[pos]);
- for(int i = pos-1; i >= 0; i--) {
- if( x[i] > x[pos] && dp[i] == dp[pos] - 1) {
- pos = i;
- ldSequence.pb(x[i]);
- }
- }
- }
- int main() {
- //READ("inputs.txt");
- int n;
- while (cin >> n) {
- REP(i, n) cin >> x[i];
- N = n - 1;
- LdsNlogk();
- decreasingSeq();
- LisNlogk();
- sequence();
- int result = -1;
- reverse(listSequence.begin(), listSequence.end());
- for(int i = listSequence.size() - 1; i >= 0; i--) {
- REP( j, ldSequence.size() ) {
- if(listSequence[i] == ldSequence[j]) {
- result = (i+1) * 2 - 1;
- break;
- }
- }
- if(result != -1) break;
- }
- cout << result << "\n";
- }
- return EXIT_SUCCESS;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement