SRM 504 div1 easy:MathContest
SRM練習会に参加しました。結果はeasy, med解いてまぁよかったんですがeasy気づくのが遅すぎて140ptくらいしか取れなかったのが残念です。
解法
単にシミュレーションするだけ。ただ本当に愚直にやると黒を引いた時にO(N)の計算量がかかって死ぬので,何回色の変換が起こったかを管理する変数cntを作ってそれの偶奇と最初のボールの配置の情報から今見ているボールが何色であるかを判断する。
少し汚い下のコードではl, rが左側の現在位置と右側の現在位置を表していて,leftが今左側からボールを見ていってるならtrue,右側から見ていってるならfalseになる。
int state[100100]; class MathContest { public: int countBlack(string ballSequence, int repetitions) { int n = ballSequence.size(); int all = n*repetitions; int l = 0, r = all-1; int cnt = 0; bool left = true; for (int i = 0; i < all; i++) { if (ballSequence[i%n] == 'B') state[i] = 1; else state[i] = 0; } int ans = 0; while (r >= l) { if (left) { if (cnt%2) { if (state[l] == 1) { l++; left = false; } else { l++; cnt++; ans++; } } else { if (state[l] == 1) { l++; cnt++; ans++; } else { l++; left = false; } } } else { if (cnt%2) { if (state[r] == 1) { r--; left = true; } else { r--; cnt++; ans++; } } else { if (state[r] == 1) { r--; cnt++; ans++; } else { r--; left = true; } } } } return ans; } };