Submission #877096

#TimeUsernameProblemLanguageResultExecution timeMemory
877096SorahISAChorus (JOI23_chorus)C++17
61 / 100
2073 ms1048576 KiB
#ifndef SorahISA #define SorahISA #include SorahISA __FILE__ SorahISA struct BIT { int maxn; vector<int> bit; BIT() {} BIT(int N) {init(N);} void init(int N) { maxn = 1 << (__lg(N) + 1); bit.assign(maxn, 0); } int query(int L, int R) {return _query(R) - _query(L-1);} int _query(int idx, int ans = 0) { while (idx) ans += bit[idx], idx -= idx & -idx; return ans; } void add(int idx, int val) { while (idx < maxn) bit[idx] += val, idx += idx & -idx; } }; void solve() { int N, K; cin >> N >> K; string S; cin >> S; vector<int> A(N+1, 0), B(N+1, 0); /// 1-based for (int i = 0, cA = 0, cB = 0; i < 2*N; ++i) { if (S[i] == 'A') A[++cA] = i+1; if (S[i] == 'B') B[++cB] = i+1; } // for (int i = 0; i <= N; ++i) debug(i, A[i], B[i]); BIT bitA, bitB; vector<vector<int>> inv(N+1, vector<int>(N+1, 0)); for (int a = 1; a <= N; ++a) { bitA.init(2*N), bitB.init(2*N); for (int i = N-1; i >= 0; --i) { bitB.add(B[i+1], 1); if (i < a) { inv[i][a] = inv[i+1][a] + bitA.query(B[i+1], 2*N) + bitB.query(1, A[i+1]); bitA.add(A[i+1], 1); } } } vector<vector<int>> dp(N+1, vector<int>(N+1, 4*N*N)); dp[0][0] = 0; vector<vector<int>> fr(N+2, vector<int>(N+1, 0)); for (int k = 1; k <= N; ++k) { fr[N+1][k] = N; for (int a = N; a >= 1; --a) { for (int i = max(int(0), fr[a][k-1]); i <= min(a-1, fr[a+1][k]); ++i) { if (chmin(dp[a][k], dp[i][k-1] + inv[i][a])) fr[a][k] = i; } } } cout << dp[N][K] << "\n"; } int32_t main() { fastIO(); int t = 1; // cin >> t; for (int _ = 1; _ <= t; ++_) { solve(); } return 0; } #else #ifdef local #define _GLIBCXX_DEBUG 1 #endif #pragma GCC optimize("Ofast", "unroll-loops") #include <bits/stdc++.h> using namespace std; #define int int64_t #define double __float80 using pii = pair<int, int>; template <typename T> using Prior = std::priority_queue<T>; template <typename T> using prior = std::priority_queue<T, vector<T>, greater<T>>; // #define X first // #define Y second #define eb emplace_back #define ef emplace_front #define ee emplace #define pb pop_back #define pf pop_front #define ALL(x) begin(x), end(x) #define RALL(x) rbegin(x), rend(x) #define SZ(x) ((int)(x).size()) #ifdef local #define fastIO() void() #define debug(...) \ fprintf(stderr, "\u001b[33mAt [%s], line %d: (%s) = ", __FUNCTION__, __LINE__, #__VA_ARGS__), \ _do(__VA_ARGS__), fprintf(stderr, "\u001b[0m") template <typename T> void _do(T &&_t) {cerr << _t << "\n";} template <typename T, typename ...U> void _do(T &&_t, U &&..._u) {cerr << _t << ", ", _do(_u...);} #else #define fastIO() ios_base::sync_with_stdio(0), cin.tie(0) #define debug(...) void() #endif template <typename T, typename U> bool chmin(T &lhs, U rhs) {return lhs > rhs ? lhs = rhs, 1 : 0;} template <typename T, typename U> bool chmax(T &lhs, U rhs) {return lhs < rhs ? lhs = rhs, 1 : 0;} #endif
#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...