提出 #44024750


ソースコード 拡げる

#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <atcoder/segtree>
using namespace atcoder;
using namespace std;
using ll = long long int;
const ll INF = 1LL << 60;

ll op_max(ll a, ll b) {
    return max(a, b);
}

ll e() {
    return -INF;
}

int main() {
    int N; cin >> N;
    vector<ll> A(N);
    for(int i=0; i<N; i++) {
        cin >> A[i];
    }

    vector<int> lim1(N), lim2(N);
    stack< pair<ll, int> > st;

    // k < i かつ A[k] >= A[i] を満たす最大の添字を探す
    st.emplace(INF, 0);
    for(int i=0; i<N; i++) {
        while(st.top().first < A[i]) st.pop();
        lim1[i] = st.top().second;
        st.emplace(A[i], i + 1);
    }
    st.pop();

    // k < i かつ A[k] <= A[i] を満たす最大の添字を探す
    st.emplace(-INF, 0);
    for(int i=0; i<N; i++) {
        while(st.top().first > A[i]) st.pop();
        lim2[i] = st.top().second;
        st.emplace(A[i], i + 1);
    }

    segtree<ll, op_max, e> seg1(N+1);
    segtree<ll, op_max, e> seg2(N+1);
    seg1.set(0, -A[0]);
    seg2.set(0, +A[0]);

    vector<ll> dp(N+1, -INF);
    dp[0] = 0;
    for(int i=0; i<N; i++) {
        // 部分列に含めない場合
        dp[i+1] = max(dp[i+1], dp[i]);
        // 部分列の最大値として使う場合
        ll v1 = seg1.prod(lim1[i], i);
        dp[i+1] = max(dp[i+1], v1 + A[i]);
        // 部分列の最小値として使う場合
        ll v2 = seg2.prod(lim2[i], i);
        dp[i+1] = max(dp[i+1], v2 - A[i]);
        if (i + 1 < N) {
            seg1.set(i+1, dp[i+1] - A[i+1]);
            seg2.set(i+1, dp[i+1] + A[i+1]);
        }
    }
    cout << dp[N] << endl;
    return 0;
}

提出情報

提出日時
問題 E - Good Partition
ユーザ tsutaj
言語 C++ (GCC 9.2.1)
得点 600
コード長 1776 Byte
結果 AC
実行時間 103 ms
メモリ 19388 KiB

ジャッジ結果

セット名 Sample All
得点 / 配点 0 / 0 600 / 600
結果
AC × 2
AC × 58
セット名 テストケース
Sample 00_sample_00, 00_sample_01
All 00_sample_00, 00_sample_01, 10_random_00, 10_random_01, 10_random_02, 10_random_03, 10_random_04, 10_random_05, 10_random_06, 10_random_07, 10_random_08, 10_random_09, 10_random_10, 10_random_11, 10_random_12, 10_random_13, 10_random_14, 10_random_15, 10_random_16, 10_random_17, 10_random_18, 10_random_19, 10_random_20, 10_random_21, 10_random_22, 10_random_23, 10_random_24, 10_random_25, 10_random_26, 10_random_27, 10_random_28, 10_random_29, 10_random_30, 10_random_31, 10_random_32, 10_random_33, 10_random_34, 10_random_35, 10_random_36, 10_random_37, 10_random_38, 10_random_39, 11_min_00, 12_max_00, 12_max_01, 12_max_02, 12_max_03, 12_max_04, 12_max_05, 12_max_06, 12_max_07, 12_max_08, 90_challenge_00, 90_challenge_01, 90_challenge_02, 91_challenge_00, 91_challenge_01, 91_challenge_02
ケース名 結果 実行時間 メモリ
00_sample_00 AC 7 ms 3388 KiB
00_sample_01 AC 2 ms 3428 KiB
10_random_00 AC 84 ms 15060 KiB
10_random_01 AC 95 ms 15864 KiB
10_random_02 AC 61 ms 9596 KiB
10_random_03 AC 87 ms 15312 KiB
10_random_04 AC 16 ms 4476 KiB
10_random_05 AC 75 ms 14596 KiB
10_random_06 AC 74 ms 14472 KiB
10_random_07 AC 22 ms 5760 KiB
10_random_08 AC 38 ms 6480 KiB
10_random_09 AC 62 ms 10056 KiB
10_random_10 AC 12 ms 4016 KiB
10_random_11 AC 39 ms 8664 KiB
10_random_12 AC 62 ms 10248 KiB
10_random_13 AC 29 ms 6168 KiB
10_random_14 AC 58 ms 9476 KiB
10_random_15 AC 60 ms 9896 KiB
10_random_16 AC 69 ms 10172 KiB
10_random_17 AC 8 ms 3508 KiB
10_random_18 AC 51 ms 9228 KiB
10_random_19 AC 12 ms 3828 KiB
10_random_20 AC 66 ms 10084 KiB
10_random_21 AC 78 ms 14904 KiB
10_random_22 AC 77 ms 14624 KiB
10_random_23 AC 45 ms 9084 KiB
10_random_24 AC 73 ms 14580 KiB
10_random_25 AC 85 ms 15184 KiB
10_random_26 AC 55 ms 9424 KiB
10_random_27 AC 76 ms 14520 KiB
10_random_28 AC 94 ms 15880 KiB
10_random_29 AC 91 ms 15456 KiB
10_random_30 AC 61 ms 9540 KiB
10_random_31 AC 24 ms 4764 KiB
10_random_32 AC 59 ms 9984 KiB
10_random_33 AC 50 ms 9240 KiB
10_random_34 AC 91 ms 15872 KiB
10_random_35 AC 77 ms 14612 KiB
10_random_36 AC 47 ms 9204 KiB
10_random_37 AC 85 ms 15192 KiB
10_random_38 AC 17 ms 4516 KiB
10_random_39 AC 39 ms 6504 KiB
11_min_00 AC 2 ms 3456 KiB
12_max_00 AC 97 ms 15880 KiB
12_max_01 AC 94 ms 15888 KiB
12_max_02 AC 98 ms 15924 KiB
12_max_03 AC 97 ms 15992 KiB
12_max_04 AC 98 ms 15928 KiB
12_max_05 AC 98 ms 15884 KiB
12_max_06 AC 97 ms 15928 KiB
12_max_07 AC 97 ms 16108 KiB
12_max_08 AC 98 ms 15928 KiB
90_challenge_00 AC 103 ms 19232 KiB
90_challenge_01 AC 103 ms 19304 KiB
90_challenge_02 AC 103 ms 19268 KiB
91_challenge_00 AC 102 ms 19228 KiB
91_challenge_01 AC 101 ms 19304 KiB
91_challenge_02 AC 102 ms 19388 KiB