Codeforces Round 1097

A. Zhily and Bracket Swapping

$A[i], B[i] = (1,1), (-1,1), (-1,-1)$ のどれかだとしてよいです.

そして,いくつかのインデックスについて $(-1,1)\to (1,-1)$ ができる.という問題だと思えます.

  • いたるところ prefix sum が非負になってください.
  • 最後には sum が $0$ になってください.

どちらの条件も,$[0,i)$ 内で操作を行ったインデックスの個数がいくつ以上いくつ以下.という類の条件で書けます.

$L_i\leq x_i\leq R_i$,$x_i\leq x_{i+1}\leq x_i+c_i$ というタイプの制約があって,全部満たすように非負整数列 $x$ をとる.という問題に言い換えられます.

B. Zhily and Barknights

$a_ib_p > a_jb_q$ となる $(i,j,p,q)$ を数える.ということをやったあとで適切な係数をかければよいです.

$a_ib_p$ の形の数を全部計算して座標圧縮しておけば,Fenwick Tree 区間クエリの形になります.

C. Zhily and Signpost

ある頂点に到達するパターンは,そこから根までの次数の LCM の周期です.特に各頂点では

  • LCM が $10^{18}$ を超えている.その頂点に到達しているクエリは高々 $1$ 種(すべて $m$ が等しい)である.
  • LCM が変わらない(次数が LCM の約数).クエリはすべて同じ方向に進む.
  • その頂点からいくつかの方向にクエリが進む.LCM が増える.

という $3$ 種だけです.各頂点に来ているすべてのクエリを持って,LCM が増えない場合には一方向だけに進むようにすれば,計算量は $O(N + Q\log \max m_q)$ のようになります.

D. Zhily and Cycle

次のグラフを考えます.

  • タイプ 1:$i\to a[i]$ に $1$ つの辺を張る.
  • タイプ 2:$i\to i+1$ に好きな個数の辺を張る.

タイプ 1 の辺をすべて通る closed walk を求めよということになります.

タイプ 2 の辺の個数を調整した上で,eulerian walk を構成ということになります.

辺を張る個数は,入次数と出次数から決まってしまいます.

入次数と出次数を適切にした上で,連結性が必要十分条件です.

あとは Eulerian Walk を構築すればよいです.DFS による eulerian walk の構築をするのですが,タイプ 2 の辺の個数が巨大となる可能性があることに注意します.区間加算区間 min のセグメント木を持って,タイプ 2 の辺をまとめて消費できるようにして実装すればよいです.

この,区間を全部通る closed walk という設定は($i\to i-1$ という辺がある場合も含めて)何度か既出なので,人によっては貼るだけだったんじゃないかな?(https://codeforces.com/contest/1685/problem/D2 など.私は最小コストだけ持ってて復元は持っていなかった)

E. Zhily and Permutation

まだ.

F. Zhily and Colorful Strings

まだ.

CodeForces
スポンサーリンク
シェアする
maspyをフォローする
maspyのHP
タイトルとURLをコピーしました