#include<bits/stdc++.h>
using namespace std ;
typedef long long ll ;
typedef unsigned long long ull ;
typedef pair < int , int > pii ;
typedef vector < int > vi ;
#define fi first
#define se second
mt19937 rng(chrono::high_resolution_clock::now().time_since_epoch().count());
#define rep(i, a, b) for(int i = a; i < (b); ++i)
#define all(x) begin(x), end(x)
#define sz(x) (int)(x).size()
const int MAXN = 1e6 + 7 ;
int n , k ;
int a[ MAXN ] , b[ MAXN ] ;
int lw[ MAXN ] , ori[ MAXN ] ;
ll pref[ MAXN ] ;
inline ll calc ( int l , int r ) {
if ( l > r ) { return 0 ; }
if ( r <= ori[ l ] ) { return 0 ; }
int aux_st = max ( ori[ l ] , l - 1 ) ;
return ( pref[ r ] - pref[ aux_st ] ) - 1LL * ( r - aux_st ) * ( l - 1 ) ;
}
ll dp[ MAXN ] ;
int ctr[ MAXN ] ;
int get_fst ( int x , int y ) {
int l , r , mid ;
l = max ( x , y ) , r = n ;
if ( dp[ x ] + calc ( x + 1 , n ) <= dp[ y ] + calc ( y + 1 , n ) ) { return n + 1 ; }
while ( l < r ) {
mid = ( l + r ) / 2 ;
if ( dp[ x ] + calc ( x + 1 , mid ) <= dp[ y ] + calc ( y + 1 , mid ) ) { l = mid + 1 ; }
else { r = mid ; }
}
return l ;
}
pair < ll , int > f ( ll sr ) {
deque < int > q ;
q.push_front ( 0 ) ;
for ( int i = 1 ; i <= n ; ++ i ) {
while ( (int)q.size ( ) >= 2 && get_fst ( q[ 0 ] , q[ 1 ] ) <= i ) {
q.pop_front ( ) ;
}
while ( (int)q.size ( ) >= 3 && get_fst ( q[ 0 ] , q[ 1 ] ) >= get_fst ( q[ 1 ] , q[ 2 ] ) ) {
int x = q[ 0 ] ;
q.pop_front ( ) ; q.pop_front ( ) ;
q.push_front ( x ) ;
}
int x = q.front ( ) ;
dp[ i ] = dp[ x ] + calc ( x + 1 , i ) + sr ;
ctr[ i ] = ctr[ x ] + 1 ;
while ( (int)q.size ( ) >= 1 && dp[ q.back ( ) ] + calc ( q.back ( ) + 1 , i ) >= dp[ i ] ) { q.pop_back ( ) ; }
q.push_back ( i ) ;
}
return { dp[ n ] , ctr[ n ] } ;
}
void solve ( ) {
cin >> n >> k ;
string s ; cin >> s ;
int pos1 = 0 , pos2 = 0 ;
for ( int i = 1 ; i <= 2 * n ; ++ i ) {
if ( s[ i - 1 ] == 'A' ) { a[ ++ pos1 ] = i ; }
else { b[ ++ pos2 ] = i ; }
}
int tp = 0 ;
for ( int i = 1 ; i <= n ; ++ i ) {
while ( tp < n && b[ tp + 1 ] < a[ i ] ) { ++ tp ; }
lw[ i ] = tp ;
pref[ i ] = pref[ i - 1 ] + lw[ i ] ;
}
pref[ n + 1 ] = pref[ n ] ;
tp = 0 ;
for ( int i = 1 ; i <= n ; ++ i ) {
while ( tp < n && lw[ tp + 1 ] < i ) { ++ tp ; }
ori[ i ] = tp ;
}
ll l , r , mid ;
l = -( 1LL << 50 ) , r = ( 1LL << 50 ) ;
ll ans = ( 1LL << 50 ) ;
while ( l < r ) {
mid = ( l + r ) / 2 ;
if ( mid == l || mid == r ) { break ; }
auto [ ret , cnt ] = f ( mid ) ;
if ( cnt > k ) { l = mid + 1 ; }
else {
r = mid ;
}
}
auto [ ret , cnt ] = f ( r ) ;
ans = min ( ans , ret - k * r ) ;
cout << ans << "\n" ;
}
int main ( ) {
ios_base :: sync_with_stdio ( false ) ;
cin.tie ( NULL ) ;
int t = 1 ; // cin >> t ;
while ( t -- ) { solve ( ) ; }
return 0 ;
}
Compilation message
chorus.cpp: In function 'void solve()':
chorus.cpp:93:14: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
93 | auto [ ret , cnt ] = f ( mid ) ;
| ^
chorus.cpp:99:10: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
99 | auto [ ret , cnt ] = f ( r ) ;
| ^
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
8536 KB |
Output is correct |
2 |
Correct |
1 ms |
8536 KB |
Output is correct |
3 |
Correct |
1 ms |
8540 KB |
Output is correct |
4 |
Correct |
1 ms |
8540 KB |
Output is correct |
5 |
Correct |
1 ms |
8540 KB |
Output is correct |
6 |
Incorrect |
1 ms |
8536 KB |
Output isn't correct |
7 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
8536 KB |
Output is correct |
2 |
Correct |
1 ms |
8536 KB |
Output is correct |
3 |
Correct |
1 ms |
8540 KB |
Output is correct |
4 |
Correct |
1 ms |
8540 KB |
Output is correct |
5 |
Correct |
1 ms |
8540 KB |
Output is correct |
6 |
Incorrect |
1 ms |
8536 KB |
Output isn't correct |
7 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
8536 KB |
Output is correct |
2 |
Correct |
1 ms |
8536 KB |
Output is correct |
3 |
Correct |
1 ms |
8540 KB |
Output is correct |
4 |
Correct |
1 ms |
8540 KB |
Output is correct |
5 |
Correct |
1 ms |
8540 KB |
Output is correct |
6 |
Incorrect |
1 ms |
8536 KB |
Output isn't correct |
7 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
8536 KB |
Output is correct |
2 |
Correct |
1 ms |
8536 KB |
Output is correct |
3 |
Correct |
1 ms |
8540 KB |
Output is correct |
4 |
Correct |
1 ms |
8540 KB |
Output is correct |
5 |
Correct |
1 ms |
8540 KB |
Output is correct |
6 |
Incorrect |
1 ms |
8536 KB |
Output isn't correct |
7 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
8536 KB |
Output is correct |
2 |
Correct |
1 ms |
8536 KB |
Output is correct |
3 |
Correct |
1 ms |
8540 KB |
Output is correct |
4 |
Correct |
1 ms |
8540 KB |
Output is correct |
5 |
Correct |
1 ms |
8540 KB |
Output is correct |
6 |
Incorrect |
1 ms |
8536 KB |
Output isn't correct |
7 |
Halted |
0 ms |
0 KB |
- |