Submission #934465

#TimeUsernameProblemLanguageResultExecution timeMemory
934465boris_mihovChorus (JOI23_chorus)C++17
40 / 100
7011 ms171988 KiB
#include <algorithm>
#include <iostream>
#include <numeric>
#include <cassert>
#include <vector>

typedef long long llong;
const int MAXN = 5000 + 10;
const int INF  = 1e9;

int n, k;
int h[MAXN];
int next[MAXN];
int prev[MAXN];
llong prefix[MAXN];
llong dp[MAXN][MAXN];
bool bl[MAXN][MAXN];
char s[2 * MAXN];

llong cost(int l, int r)
{
    if (next[l] > r)
    {
        return 0;
    }

    return (next[l] - l + 1) * (l - 1) + prefix[r] - prefix[next[l]] - (r - l + 1) * (l - 1);
}

int f(int pos, int cnt)
{
    if (pos == n + 1)
    {
        if (cnt == k) return 0;
        return INF;
    }

    if (bl[pos][cnt])
    {
        return dp[pos][cnt];
    }

    dp[pos][cnt] = INF;
    bl[pos][cnt] = true;
    for (int next = pos + 1 ; next <= n + 1 ; ++next)
    {
        dp[pos][cnt] = std::min(dp[pos][cnt], f(next, cnt + 1) + cost(pos, next - 1));
    }

    return dp[pos][cnt];
}

void solve()
{
    int cntA = 0;
    int cntB = 0;
    for (int i = 1 ; i <= 2 * n ; ++i)
    {
        if (s[i] == 'B')
        {
            cntB++;
        } else
        {
            cntA++;
            h[cntA] = cntB;
        }
    }

    for (int i = 1 ; i <= n ; ++i)
    {
        prefix[i] = prefix[i - 1] + h[i];
    }

    next[n + 1] = n + 1;
    h[n + 1] = n + 1;
    for (int i = n ; i >= 1 ; --i)
    {
        next[i] = next[i + 1];
        while (next[i] >= i && h[next[i]] >= i)
        {
            next[i]--;
        }
    }

    prev[0] = 0;
    for (int i = 1 ; i <= n ; ++i)
    {
        prev[i] = prev[i - 1];
        while (prev[i] <= i && h[prev[i]] < i)
        {
            prev[i]++;
        }
    }

    std::cout << f(1, 0) << '\n';
}

void input()
{
    std::cin >> n >> k;
    std::cin >> s + 1;
}

void fastIOI()
{
    std::ios_base :: sync_with_stdio(0);
    std::cout.tie(nullptr);
    std::cin.tie(nullptr);
}

int main()
{
    fastIOI();
    input();
    solve();

    return 0;
}

Compilation message (stderr)

chorus.cpp: In function 'void input()':
chorus.cpp:101:19: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  101 |     std::cin >> s + 1;
      |                 ~~^~~
#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...