リンク:https://codeforces.com/problemset/problem/1215/D
MonocarpとBicarpは、すべてのバスのチケットはで構成バーランドに住んで n個のn桁(nは nは偶数です)。夕方の散歩中にMonocarpとBicarpは数字の一部が消去されたチケットを発見しました。 消去された桁数が偶数です。
MonocarpとBicarpは、このチケットでゲームをプレイすることにしました。Bicarpはそれらを収集しながらMonocarpは、幸せなチケットを嫌っています。最初の合計場合はチケットが幸せと考えられている N 2このチケットのN2の桁が最後の和に等しい nは2 n2の桁。
MonocarpとBicarpは、ターンを取る(とMonocarpは彼らの最初の実行します)。各ターンの間に、現在のプレーヤーはから任意の数字を持つ任意の消去桁置き換える必要があります 0に0を 9一切消去桁がチケットに存在しない場合、ゲームが終了9。
チケットはすべて消去桁は小数点以下の桁数に置き換えられた後に幸せであれば、Bicarp勝。それ以外の場合は、Monocarp勝。あなたは、両方のプレイヤーが最適に再生した場合に勝つ者を決定する必要があります。
最初の行は、一つが含まれてい ても、整数 N、N (2 ≤ N ≤ 2 ⋅ 10 5 )(2≤n≤2⋅105) -チケットの桁数。
2行目は文字列が含まれ 、n個の n桁との「?」文字- MonocarpとBicarpが発見したチケット。場合 I i番目の文字は「?」、そして I i番目の数字が消去されます。先行ゼロがあるかもしれないことに注意してください。多くの「?」文字さえあります。
Monocarpが勝てば、プリント" (引用符なし)Monocarp"。それ以外の場合は、「印刷(引用符なし)Bicarpを」。
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 const int型 MAXN = 2E5 + 5 。 int型のn; チャーS [MAXN]。 int型LS、RS、X、Y。 INT メイン() { scanf関数(" %のD "、&N) scanf関数(" %sの"、S + 1 )。 以下のために(int型私= 1 ; iが<= N / 2 ; iが++ ){ 場合(S [I] == ' ?')x ++ 。 他LS + = S [I] - ' 0 ' 。 } のために(int型 I = N / 2 + 1 ; I <= N; iは++ ){ もし、(S [I] == ' ?')yは++ 。 他に、RS + = S [i]が- ' 0 ' ; } であれば(LS < RS){ スワップ(LS、RS)。スワップ(X、Y) } であれば(LS == RS){ のprintf(" %sの\ nを"あり、x == yの?" Bicarp ":" Monocarp "); } 他{ 場合(X> = Y)のprintf(" Monocarpの\ n " ); 他のprintf(" %sのの\ nを"、(Y-X)%2 == 0 && LS-RS ==(YX)/ 2 * 9?" Bicarp ":" Monocarp " ); } 戻り 0 。 }