Submission #796424

#TimeUsernameProblemLanguageResultExecution timeMemory
796424JohannChorus (JOI23_chorus)C++14
40 / 100
7031 ms392380 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; 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) { int idx = k - 1; for (int j = k; j <= N; ++j) { for (int i = idx; i < j; ++i) if (dp[i][k - 1] + trans[i][j] <= dp[idx][k - 1] + trans[idx][j]) idx = i; // while (idx + 1 < j && dp[idx][k - 1] + trans[idx][j] >= dp[idx + 1][k - 1] + trans[idx + 1][j]) // ++idx; dp[j][k] = dp[idx][k - 1] + trans[idx][j]; } } 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...