Submission #906456

#TimeUsernameProblemLanguageResultExecution timeMemory
906456LucaIlieChorus (JOI23_chorus)C++17
0 / 100
2 ms8540 KiB
#include <bits/stdc++.h> using namespace std; const int MAX_N = 1e6; int a[MAX_N + 1], countLowerA[MAX_N + 1]; long long sumA[MAX_N + 1], sumLowerA[MAX_N + 1], minSwaps[MAX_N + 1], minGroups[MAX_N + 1]; void computeDP( int n, long long cost ) { for ( int i = 1; i <= n; i++ ) minSwaps[i] = (long long)n * cost + 1; for ( int i = 1; i <= n; i++ ) { minSwaps[i] = n * n; for ( int j = i - 1; j >= 0; j-- ) { long long s = minSwaps[j] + (long long)i * (countLowerA[i] - j) - (sumLowerA[i] - sumA[j]) + cost; if ( s < minSwaps[i] ) { minSwaps[i] = s; minGroups[i] = minGroups[j] + 1; } else if ( s == minSwaps[i] ) minGroups[i] = min( minGroups[i], minGroups[j] + 1 ); } } } int main() { int n, k, swaps; cin >> n >> k; int countB = 0, countA = 0; swaps = 0; for ( int i = 0; i < 2 * n; i++ ) { char ch; cin >> ch; if ( ch == 'A' ) countA++; else { countB++; swaps += max( 0, countB - countA ); a[countB] = max( countA, countB ); sumA[countB] = sumA[countB - 1] + a[countB]; countLowerA[a[countB]]++; sumLowerA[a[countB]] += a[countB]; } } for ( int i = 1; i <= n; i++ ) { countLowerA[i] += countLowerA[i - 1]; sumLowerA[i] += sumLowerA[i - 1]; } long long leftCost = 0, rightCost = 1e12; while ( rightCost - leftCost > 1 ) { long long cost = (leftCost + rightCost) / 2; computeDP( n, cost ); if ( minGroups[n] > k ) leftCost = cost; else rightCost = cost; } computeDP( n, rightCost ); cout << swaps + minSwaps[n] - minGroups[n] * rightCost; 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...