結果

問題 No.1029 JJOOII 3
ユーザー kimiyukikimiyuki
提出日時 2020-04-17 22:23:57
言語 C++17
(gcc 12.3.0 + boost 1.83.0)
結果
AC  
実行時間 433 ms / 2,000 ms
コード長 4,097 bytes
コンパイル時間 2,260 ms
コンパイル使用メモリ 209,652 KB
実行使用メモリ 5,416 KB
最終ジャッジ日時 2023-07-27 01:16:12
合計ジャッジ時間 9,210 ms
ジャッジサーバーID
(参考情報)
judge14 / judge11
このコードへのチャレンジ(β)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 2 ms
4,380 KB
testcase_01 AC 1 ms
4,376 KB
testcase_02 AC 2 ms
4,380 KB
testcase_03 AC 18 ms
4,376 KB
testcase_04 AC 63 ms
4,596 KB
testcase_05 AC 283 ms
5,120 KB
testcase_06 AC 199 ms
4,572 KB
testcase_07 AC 245 ms
4,808 KB
testcase_08 AC 276 ms
5,140 KB
testcase_09 AC 232 ms
4,852 KB
testcase_10 AC 242 ms
4,856 KB
testcase_11 AC 302 ms
5,268 KB
testcase_12 AC 163 ms
4,448 KB
testcase_13 AC 300 ms
5,408 KB
testcase_14 AC 309 ms
5,404 KB
testcase_15 AC 91 ms
4,600 KB
testcase_16 AC 4 ms
4,824 KB
testcase_17 AC 259 ms
5,068 KB
testcase_18 AC 285 ms
5,416 KB
testcase_19 AC 2 ms
4,380 KB
testcase_20 AC 1 ms
4,376 KB
testcase_21 AC 2 ms
4,380 KB
testcase_22 AC 2 ms
4,376 KB
testcase_23 AC 2 ms
4,376 KB
testcase_24 AC 2 ms
4,380 KB
testcase_25 AC 2 ms
4,380 KB
testcase_26 AC 2 ms
4,376 KB
testcase_27 AC 2 ms
4,380 KB
testcase_28 AC 2 ms
4,376 KB
testcase_29 AC 2 ms
4,376 KB
testcase_30 AC 2 ms
4,376 KB
testcase_31 AC 2 ms
4,380 KB
testcase_32 AC 430 ms
5,336 KB
testcase_33 AC 431 ms
5,416 KB
testcase_34 AC 430 ms
5,404 KB
testcase_35 AC 429 ms
5,352 KB
testcase_36 AC 433 ms
5,384 KB
testcase_37 AC 2 ms
4,376 KB
testcase_38 AC 2 ms
4,380 KB
testcase_39 AC 2 ms
4,380 KB
testcase_40 AC 1 ms
4,376 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#line 1 "main.cpp"
#include <bits/stdc++.h>
#line 2 "/home/user/GitHub/competitive-programming-library/utils/macros.hpp"
#define REP(i, n) for (int i = 0; (i) < (int)(n); ++ (i))
#define REP3(i, m, n) for (int i = (m); (i) < (int)(n); ++ (i))
#define REP_R(i, n) for (int i = (int)(n) - 1; (i) >= 0; -- (i))
#define REP3R(i, m, n) for (int i = (int)(n) - 1; (i) >= (int)(m); -- (i))
#define ALL(x) std::begin(x), std::end(x)
#line 4 "/home/user/GitHub/competitive-programming-library/utils/binary_search.hpp"

/**
 * @brief a binary search / 二分探索
 * @param[in] p  a monotone predicate defined on $[l, r)$
 * @return $\min \lbrace x \in [l, r) \mid p(x) \rbrace$, or r if it doesn't exist
 */
template <typename UnaryPredicate>
int64_t binsearch(int64_t l, int64_t r, UnaryPredicate p) {
    assert (l <= r);
    -- l;
    while (r - l > 1) {
        int64_t m = l + (r - l) / 2;
        (p(m) ? r : l) = m;
    }
    return r;
}

/**
 * @return $\max \lbrace x \in (l, r] \mid p(x) \rbrace$, or l if it doesn't exist
 */
template <typename UnaryPredicate>
int64_t binsearch_max(int64_t l, int64_t r, UnaryPredicate p) {
    assert (l <= r);
    ++ r;
    while (r - l > 1) {
        int64_t m = l + (r - l) / 2;
        (p(m) ? l : r) = m;
    }
    return l;
}
#line 4 "main.cpp"
using namespace std;
template <class T, class U> inline void chmin(T & a, U const & b) { a = min<T>(a, b); }


int64_t solve(int n, int k, const vector<string> & s, const vector<int64_t> & cost) {
    vector<vector<int> > acc_a(n);
    vector<vector<int> > acc_b(n);
    vector<vector<int> > acc_c(n);
    REP (i, n) {
        acc_a[i].resize(s[i].size() + 1);
        acc_b[i].resize(s[i].size() + 1);
        acc_c[i].resize(s[i].size() + 1);
        REP (j, s[i].size()) {
            acc_a[i][j + 1] = acc_a[i][j] + (s[i][j] == 'J');
            acc_b[i][j + 1] = acc_b[i][j] + (s[i][j] == 'O');
            acc_c[i][j + 1] = acc_c[i][j] + (s[i][j] == 'I');
        }
    }

    vector<int64_t> dp(3 * k + 1, INT64_MAX);
    dp[0] = 0;
    REP (j, k) if (dp[j] != INT64_MAX) {
        REP (i, n) {
            int m = s[i].size();
            int l = 0;
            int r = binsearch(l, m, [&](int r) {
                return j + acc_a[i][r] - acc_a[i][l] >= k;
            });
            int nj;
            if (r == m) {
                nj = j + acc_a[i][r] - acc_a[i][l];
            } else {
                l = r;
                r = binsearch(l, m, [&](int r) {
                    return acc_b[i][r] - acc_b[i][l] >= k;
                });
                if (r == m) {
                    nj = k + acc_b[i][r] - acc_b[i][l];
                } else {
                    l = r;
                    r = m;
                    nj = 2 * k + min(k, acc_c[i][r] - acc_c[i][l]);
                }
            }
            chmin(dp[nj], dp[j] + cost[i]);
        }
    }
    REP (j, k) if (dp[k + j] != INT64_MAX) {
        REP (i, n) {
            int m = s[i].size();
            int l = 0;
            int r = binsearch(l, m, [&](int r) {
                return j + acc_b[i][r] - acc_b[i][l] >= k;
            });
            int nj;
            if (r == m) {
                nj = k + j + acc_b[i][r] - acc_b[i][l];
            } else {
                l = r;
                r = m;
                nj = 2 * k + min(k, acc_c[i][r] - acc_c[i][l]);
            }
            chmin(dp[nj], dp[k + j] + cost[i]);
        }
    }
    REP (j, k) if (dp[2 * k + j] != INT64_MAX) {
        REP (i, n) {
            int m = s[i].size();
            int l = 0;
            int r = m;
            int nj = 2 * k + min(k, j + acc_c[i][r] - acc_c[i][l]);
            chmin(dp[nj], dp[2 * k + j] + cost[i]);
        }
    }
    return dp.back();
}

int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    constexpr char endl = '\n';
    int N;
    int K;
    cin >> N;
    vector<string> S(N);
    vector<int64_t> C(N);
    cin >> K;
    REP (i, N) {
        cin >> S[i] >> C[i];
    }
    auto ans = solve(N, K, S, C);
    cout << (ans == INT64_MAX ? -1 : ans) << endl;
    return 0;
}
0