バイトの競プロメモ

主に競技プログラミング

A - Taro vs. Jiro 第5回 ドワンゴからの挑戦状 本選

A - Taro vs. Jiro

解法
Kの制約が大きすぎるので、少ない場合と同じに考えられることが予想できる。
実際に考えてみると、Kが1なら隣にBがあれば勝ち。
次にどんな操作をされても、Bに戻せるため、Kが奇数のときと1の時を同視していいと分かる。
Kが偶数の場合、1手動かして相手に渡した時に隣に赤が無ければ勝てると分かる

問題の芯
操作をキャンセルでき、K = K%2
Submission #3860060 - 第5回 ドワンゴからの挑戦状 本選(オープンコンテスト)

undigraph<> g(k5);
signed main() {
cin >> N >> M >> K;
string s = sin();
g.resize(N);
rep(i, M) {
int a, b;
cin >> a >> b;
g.add(--a, --b);
}
if (K % 2) {
rep(i, N) {
bool win = 0;
for (auto &&e :g.g[i]) {
if (s[e.to] == 'B') {
win = 1;
}
}
if (win)cout << "First" << endl;
else cout << "Second" << endl;
}
} else {
vb winp(N, false);
rep(i, N) {
bool win = 1;
for (auto &&e :g.g[i]) {
if (s[e.to] == 'R') {
win = 0;
}
}
winp[i] = win;
}
rep(i, N) {
bool win = 0;
for (auto &&e :g.g[i]) {
if (winp[e.to])win = 1;
}
if(win)cout << "First" << endl;
else cout << "Second" << endl;
}
}

return 0;
}