Submission #796615

#TimeUsernameProblemLanguageResultExecution timeMemory
796615JohannChorus (JOI23_chorus)C++14
61 / 100
1421 ms1048576 KiB
#include "bits/stdc++.h"
using namespace std;

typedef long long ll;
typedef vector<ll> vi;
typedef vector<vi> vvi;
typedef pair<int, int> pii;
typedef vector<pii> vpii;
#define sz(x) (int)(x).size()
#define all(x) (x).begin(), (x).end()

const ll INF = 1LL << 60;
int N, K;
vi S;
int cnt[2];
vi pos[2];
vvi dp;
vvi trans;

void dc(int k, int l, int r, int lx, int rx)
{
    if (r - l <= 0)
        return;
    int j = (l + r) / 2;
    int idx = lx;
    for (int i = lx; i < rx; ++i)
        if (dp[i][k - 1] + trans[i][j] <= dp[idx][k - 1] + trans[idx][j])
            idx = i;

    dp[j][k] = dp[idx][k - 1] + trans[idx][j];

    dc(k, l, j, lx, idx + 1);
    dc(k, j + 1, r, idx, rx);
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);

    cin >> N >> K;
    string SS;
    cin >> SS;
    S.resize(2 * N);
    for (int foo = 0; foo < 2; ++foo)
        pos[foo].assign(N, -1);
    for (int i = 0; i < 2 * N; ++i)
    {
        S[i] = (SS[i] == 'B');
        pos[S[i]][cnt[S[i]]++] = i;
    }

    trans = vvi(N + 1, vi(N + 1, INF));
    for (int i = 1; i <= N; ++i)
    {
        trans[i][i] = 0;
        int border = 2 * i;
        for (int j = i; j < N; ++j)
            trans[i][j + 1] = trans[i][j] + max(0LL, pos[0][j] - border++);
    }

    dp = vvi(N + 1, vi(K + 1, INF));

    dp[0][0] = 0;
    dp[0][1] = 0;
    for (int i = 0; i < N; ++i)
        dp[i + 1][1] = dp[i][1] + pos[0][i] - i;

    for (int k = 2; k <= K; ++k)
    {
        dc(k, k, N + 1, k - 1, N);
    }

    cout << dp[N][K] << endl;

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...