[ create a new paste ] login | about

Link: http://codepad.org/SL8tEso4    [ raw code | fork ]

C++, pasted on Dec 16:
#include <bits/stdc++.h>
#define sz(x) (int((x).size()))
template<typename T> bool domax(T &a, T b) { return (b > a ? (a = b, true) : false); }
template<typename T> bool domin(T &a, T b) { return (b < a ? (a = b, true) : false); }
typedef long long ll;

const int MaxN = 50005;

int N, a[MaxN], b[MaxN], dp[MaxN], dp2[MaxN], ans;
bool seen[MaxN+MaxN];
std::set<int> s;

int main()
{
    freopen("cardgame.in", "r", stdin);
    freopen("cardgame.out", "w", stdout);
    scanf("%d", &N);
    for (int i = 0; i < N; i++) {
        scanf("%d", &a[i]);
        seen[a[i]] = true;
    }
    
    int B = 0;
    for (int i = 1; i <= N+N; i++) {
        if (!seen[i]) b[B++] = i;
    }

    for (int i = 0; i < N; i++) s.insert(b[i]);
    for (int i = 0; i < N; i++) {
        if (i) dp[i] = dp[i-1];
        auto j = s.lower_bound(a[i]);
        if (j != s.end()) {
            dp[i]++;
            s.erase(j);
        }
    }

    s.clear();
    for (int i = 0; i < N; i++) s.insert(b[i]);
    for (int i = N-1; i >= 0; i--) {
        dp2[i] = dp2[i+1];
        auto j = s.lower_bound(a[i]);
        if (j != s.begin()) {
            dp2[i]++;
            j--;
            s.erase(j);
        }
    }

    ans = std::max(dp2[0], dp[N-1]);
    for (int i = 1; i < N; i++) domax(ans, dp[i-1] + dp2[i]);
    printf("%d\n", ans);
}


Create a new paste based on this one


Comments: