はまやんはまやんはまやん

hamayanhamayan's blog

Colored Balls [CODE THANKS FESTIVAL 2018 B]

https://beta.atcoder.jp/contests/code-thanks-festival-2018-open/tasks/code_thanks_festival_2018_b

解説

https://beta.atcoder.jp/contests/code-thanks-festival-2018-open/submissions/3664345

  • 結構難しい問題に見える
  • 200点問題
  • 制約もでかい

ということから、場合分けの方針で考える。
 
満たすべき条件を考えると

  • 2つの玉の個数の差は偶数
  • どちらも同じ数の場合は両方削ると-4ずつできるので、4の倍数である必要がある

この2つを使って0にできるか考える。
未証明だけどACできた。
 
X<Yとして進めていく。
差のd=Y-Xが奇数ならNo
偶数ならd/2回だけ、赤1, 青3を行えるので、赤からd/2, 青からd/2*3を引く。
これで負の数が出てきたり、X=YにならなかったらNo
 
どちらも同じ数になったので、4の倍数かをチェックする。
そうでないならNo
そうなら、全部消せるのでYes

int X, Y;
//---------------------------------------------------------------------------------------------------
#define yes "Yes"
#define no "No"
string solve() {
    int d = Y - X;
    if (d % 2) return no;
 
    X -= d / 2;
    Y -= d / 2 * 3;
 
    if (0 <= X and X == Y) {
        if (X % 4) return no;
        return yes;
    }
    else return no;
}
//---------------------------------------------------------------------------------------------------
void _main() {
    cin >> X >> Y;
    if (X > Y) swap(X, Y);
    cout << solve() << endl;
}