//Jakub Rozek
//Wystawa
//czas: 2^n
//pamiec: n
#include "bits/stdc++.h"
using namespace std;
const int N=100005;
const long long INF=10000000000000016;
long long odp=INF;
int n,k;
bool odwroc;
bitset <N> obecny;
bitset <N> wynik;
long long t[2][N];
long long dp[N][2];
void wczytaj(int p)
{
for(int i=1; i<=n; ++i) cin>>t[p][i];
}
void licz(int i, int kk, long long suf, long long wyn)
{
if(suf>=odp) return;
if(suf<0) suf=0;
if(suf>wyn) wyn=suf;
if(kk==k)
{
if(dp[i][1]>wyn) wyn=dp[i][1];
suf+=dp[i][0];
if(suf>wyn) wyn=suf;
if(wyn<odp)
{
odp=wyn;
wynik=obecny;
}
return;
}
if(i>n || n-i+1<k-kk) return;
obecny[i]=1;
licz(i+1,kk+1,suf+t[0][i],wyn);
obecny[i]=0;
licz(i+1,kk,suf+t[1][i],wyn);
return;
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cin>>n>>k;
if(k*2<=n)
{
odwroc=0;
wczytaj(0);
wczytaj(1);
}
else
{
k=n-k;
odwroc=1;
wczytaj(1);
wczytaj(0);
}
for(int i=n; i>=1; --i)
{
dp[i][0]=max((long long)0,dp[i+1][0]+t[1][i]);
dp[i][1]=max(dp[i+1][1],dp[i][0]);
}
licz(1,0,0,0);
cout<<odp<<"\n";
if(odwroc) for(int i=1; i<=n; ++i) wynik[i]=!wynik[i];
for(int i=1; i<=n; ++i)
{
if(wynik[i]) cout<<"A";
else cout<<"B";
}
return 0;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 | //Jakub Rozek //Wystawa //czas: 2^n //pamiec: n #include "bits/stdc++.h" using namespace std; const int N=100005; const long long INF=10000000000000016; long long odp=INF; int n,k; bool odwroc; bitset <N> obecny; bitset <N> wynik; long long t[2][N]; long long dp[N][2]; void wczytaj(int p) { for(int i=1; i<=n; ++i) cin>>t[p][i]; } void licz(int i, int kk, long long suf, long long wyn) { if(suf>=odp) return; if(suf<0) suf=0; if(suf>wyn) wyn=suf; if(kk==k) { if(dp[i][1]>wyn) wyn=dp[i][1]; suf+=dp[i][0]; if(suf>wyn) wyn=suf; if(wyn<odp) { odp=wyn; wynik=obecny; } return; } if(i>n || n-i+1<k-kk) return; obecny[i]=1; licz(i+1,kk+1,suf+t[0][i],wyn); obecny[i]=0; licz(i+1,kk,suf+t[1][i],wyn); return; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cin>>n>>k; if(k*2<=n) { odwroc=0; wczytaj(0); wczytaj(1); } else { k=n-k; odwroc=1; wczytaj(1); wczytaj(0); } for(int i=n; i>=1; --i) { dp[i][0]=max((long long)0,dp[i+1][0]+t[1][i]); dp[i][1]=max(dp[i+1][1],dp[i][0]); } licz(1,0,0,0); cout<<odp<<"\n"; if(odwroc) for(int i=1; i<=n; ++i) wynik[i]=!wynik[i]; for(int i=1; i<=n; ++i) { if(wynik[i]) cout<<"A"; else cout<<"B"; } return 0; } |
English