# **[2020/01/28 Shichifuku04](https://onlinejudge.u-aizu.ac.jp/services/room.html#shichifuku04/)** # **A. Bit String Reordering** 問題見てない. # **C. Shopping** ## 読解 一次元上に $1$ ~ $N$ の店が並んでいて隣同士の間隔は $1$. $m$ 個の制約 (店 $c$ は店 $d$ の後に訪れないといけない) が与えられるので, 店 $1$ から店 $N$ までの最短経路を求める. (実際には $+1$ したものを出力する.) ## 解法 よく見ると $c < d$ なので, 右に向かって左に向かって右に向かえば良い. 重なっている区間ごとに分けて考えれば正しく求まる. # **E. Automotive Navigation** 問題見てない. # **G. Flipping Parentheses** ## 読解 正しい括弧列に対して, 各クエリで列中の $1$ 文字が指定されるので反転し, 反転すると正しい括弧列に戻るような最も左の文字を求める (+反転する). ## 解法 正しい括弧列 $\iff$ 累積和がすべて正かつ (全体の和) $= 0$. これを用いると, - 反転する文字が '(' → 最も左の ')' を反転 - 反転する文字が ')' → '(' のうち, その文字より右の累積和がすべて $2$ 以上で最も左のものを反転 となる. どちらもセグ木 (StarrySkyTree: 区間加算区間min) 上を二分探索することで実現可能. ## ソースコード ```cpp= ll N, Q, A; cin >> N >> Q; string S; cin >> S; starry_sky_tree seg(N); rep(i, N) seg.add(i + 1, N + 1, S[i] == '(' ? 1 : -1); rep(i, Q) { cin >> A; if (S[A - 1] == '(') { S[A - 1] = ')'; seg.add(A, N + 1, -2); ll ng = 0, ok = A; while (ok - ng > 1) { ll md = (ok + ng) / 2; if (seg.getmin(md, md + 1) < md) { // S[i] == ')' <=> 累積和[i] < i ok = md; } else { ng = md; } } cout << ok << rt; S[ok - 1] = '('; seg.add(ok, N + 1, 2); } else { S[A - 1] = '('; seg.add(A, N + 1, 2); ll ng = 0, ok = A; while (ok - ng > 1) { ll md = (ok + ng) / 2; if (seg.getmin(md, N) >= 2) { // 累積和[i, N) >= 2 ok = md; } else { ng = md; } } cout << ok << rt; S[ok - 1] = ')'; seg.add(ok, N + 1, -2); } } ``` ## コメント これを 30 分以内に通せたのは嬉しい. # **I. Sweet War** ## 読解 よくある取り合いゲーム. チョコレート ($1$ ~ $N$) にはそれぞれにパラメータ $S,\ R$ があり, $2$ 人は交互に順に以下の行動をする. - pass する. 満腹度が $1$ 減る. (満腹度の初期値は $2$ 人それぞれ $A,\ B$.) - eat する. 一番上のチョコレートを食べ, 満腹度が $S$ 増え, 得点が $R$ 増える. ## コンテスト中の考察 とりあえず満腹度の上限が小さいと仮定する ($\sum S$ がかなり小さいため). ゲーム DP なので後ろから DP したい. が, バグらせて答えが合わない. # **K. $L_\infty$ Jumps** ## 読解 毎回同じ半径の正方形のマスにジャンプできるので, $(0,\ 0)$ から $(s,\ t)$ へちょうど $N$ 回で行く最小コストを求める. ただし, ジャンプのコストは各回で変更され, それぞれ $(+x,\ +y)$ のコストが $1$ で反時計回りに $1$ ずつ増加. ## コンテスト中の考察 まず, ジャンプする方向 (NEWS) とその回数を決め打つと, 到達可能性については範囲に変換される. また, コストが平等なので, 割と貪欲にとっても問題なさそう. ## コメント 最終的には DP らしい. 本番で通したチーム $0$ らしい.