Neowise Labs Contest 1 (Codeforces Round 1018)

A. Wonderful Sticks

topological sort すればよいです.

B. Wonderful Gloves

$l_i\leq r_i$ としてよいです.その色についての最悪ケースは,$r_i+1$ 回目に $1$ 点を得られるという状況です.

とりあえず全部の色で $r_i$ 回とっておきます.そのあと,$1$ 点を得た後に無駄操作ができる回数が多いものから順に貪欲にとっていきます.

C. Wonderful City

同じ行の中での隣接が生ずるかどうかは列に対する操作だけから決まります.

同じ列の中での隣接が生ずるかどうかは行に対する操作だけから決まります.

よって,列操作・行操作について独立に解くことができます.

各行について操作する,しないという $01$ 列を決める,ただし隣接 $2$ 数について不可能なペアがある.という形になって,単純な dp で最適化できます.

D. Wonderful Lightbulbs

適当に座標変換すれば操作は軸に平行な正方形になります.そのあと $x$ 座標の多重集合に注目すると常にどの値も偶数回登場するという条件が保たれます.

E. Wonderful Teddy Bears

転倒数を $a$,インデックスの parity を変化させなければいけない $0$ の個数を $b$ とします.

このとき,転倒数が $1$ 以下しか減らない操作が $b$ 回以上必要です.全体では $\frac{a+b}{2}$ 回の操作が必要です.

これが下からの評価ですが,これは達成であることが示せます.

ソート済でない 0,1 列において,$\frac{a+b}{2}$ がちょうど $1$ 小さくなるような操作が可能であることを示せばよいです.

転倒数を $2$ 減らせる操作が可能ならそれでよいです.そうでないとき,0000001010..10101111… という形になっていることが分かり,転倒数を $1$ 減らしながら parity の偏りを $1$ 減らすことができます.

F. Wonderful Impostors

$[L,R]$ が valid であるという条件には単調性があります.尺取り法で答を求めることを考えると,次ができればよいことになります.

  • ある条件を追加したときに矛盾が生じるかどうかを確認する.
  • 矛盾が生じない条件を追加する.
  • 条件を削除する.

タイプ 0 の区間 $[a,b]$ を追加できるかの判定は,タイプ 0 の区間の和集合において $[a,b]$ を含む極大区間をとってきて,それに含まれるタイプ 1 区間があるかどうかを判定すればよいです.

各インデックスが区間に被覆されている回数の列を管理することにして,極大区間 $[p,q]$ の取得についてはセグメント木二分探索でできます.それに含まれるタイプ 1 区間についても,$p\leq a\leq q$ となるタイプ 1 区間 $[a,b]$ に対する $\min b$ の検索と言い換えればセグメント木でできます.

タイプ 1 の条件の追加の判定も同様です.条件の追加削除も上のデータの持ち方でそのままできます.

G. Wonderful Guessing Game

$K$ 回のクエリで攻略する方法を考えます.言い換え問題文としては,

  • $1,2,\ldots,N$ のそれぞれに,長さ $K$ の文字列(文字は 0, 1, 2)を割り当てる.
  • 各 $j$ について,$j$ 文字目が 0 であるものの個数と $j$ 文字目が 1 であるものの個数は等しくせよ.
  • 各 $j$ について,$j$ 文字目をすべて削除しても $N$ 個の文字列は異なるようにせよ.

まず $L,R$ が同数という条件を忘れて解きます.$1$ 文字目を削除しても $N$ 個の文字列が異なるようにするには,$N\leq 3^{K-1}$ が必要です.0, 1, 2 からなる長さ $K$ の列であって,総和が $3$ の倍数となるものを全部集めて,そのうち $N$ 個を選ぶことで, $N=3^{K-1}$ で条件を満たすことも可能です.

あとは 0, 1 の個数をそろえるということをやる必要があります.代わりに次を目指すことにします:

  • 各 $j$ について,$j$ 文字目に現れる $0, 1, 2$ の個数はどれも $\lfloor N/3\rfloor$ 以上 $\lceil N/3\rceil$ 以下である.

要するに $0,1,2$ の出現回数が均等であるこということです.これが成り立つならば,$j$ ごとに $j$ 文字目の文字種を置換することで,問題の条件を満たせます.

さらにこれを達成するには,次ができればよいです.

  • $3^{K-1}$ 個の文字列を,$3$ つ組に分割する.各組の中ではすべての $j$ で $0,1,2$ が一度ずつ現れるようにする.

これができれば,$3$ つ組を固めて $3^{K-1}$ 個の文字列を並べたあとそのうち先頭から $N$ 個をとってくれば条件を満たします.

$3$ つ組に分割するには,$1, 2$ からなる長さ $K$ かつ総和が $3$ の倍数であるような列をひとつとって,それを足して移りあうものを $3$ つ組とすればよいです.

H. Wonderful XOR Problem

次の問題を参照してください.コンテスト当日に日本人の AC が多かったのもこの問題のためです.

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