Submission #906485

#TimeUsernameProblemLanguageResultExecution timeMemory
906485LucaIlieChorus (JOI23_chorus)C++17
61 / 100
7103 ms13136 KiB
#include <bits/stdc++.h> using namespace std; const int MAX_N = 1e6; const long long INF = 1e18; int a[MAX_N + 1], countLowerA[MAX_N + 1], minGroups[MAX_N + 1], maxGroups[MAX_N + 1]; long long sumA[MAX_N + 1], sumLowerA[MAX_N + 1], minSwaps[MAX_N + 1]; void computeDP( int n, long long cost ) { for ( int i = 1; i <= n; i++ ) { minSwaps[i] = INF; minGroups[i] = n + 1; maxGroups[i] = 0; for ( int j = i - 1; j >= 0; j-- ) { long long s = (minSwaps[j] + sumA[j]) + i * (-j); if ( s < minSwaps[i] ) { minSwaps[i] = s; minGroups[i] = minGroups[j] + 1; maxGroups[i] = maxGroups[j] + 1; } else if ( s == minSwaps[i] ) { minGroups[i] = min( minGroups[i], minGroups[j] + 1 ); maxGroups[i] = max( maxGroups[i], maxGroups[j] + 1 ); } } minSwaps[i] += i * countLowerA[i] - sumLowerA[i] + cost; } } 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 = -1, 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] - min( k, maxGroups[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...