AtCoder Regular Contest 227 A,B 問題メモ

AtCoder Regular Contest 227

CDEが700点3連続構成。時間があればどれかは解けると思ったんだけどなぁ。

A - Fermat Point of Binary Strings

問題文

  • 長さ $2N$ で、01 をそれぞれ $N$ 個含む文字列をよい文字列と呼びます。
  • よい文字列 $S, T$ に対して、$S$ の隣り合う $2$ 文字を入れ替える操作を $0$ 回以上行って$T$ に一致させるために必要な操作回数の最小値を $\operatorname{dist}(S, T)$ とします。
  • よい文字列 $A, B, C$ が与えられます。すべてのよい文字列 $X$ のうち、
  • \[\operatorname{dist}(A, X)+\operatorname{dist}(B, X)+\operatorname{dist}(C, X)\]
  • の値を最小にするものを $1$ つ求め、その最小値とともに出力してください。

制約

  • $1 \le N \le 2 \times 10^5$
  • $A, B, C$ はそれぞれ長さ $2N$ のよい文字列
  • $N$ は整数

解法

$dist(S,T)$ を求めるのにやることは明らかで、$i=1,2,...,N$ 個目の 1 の出現位置の差を取り、合計すればいい。

S  0 1 0 0 1 1 1 0
   ,-' ,---' | `-,
T  1 0 1 0 0 1 0 1

$S$ 側が $A,B,C$ の3通りになった時も、$i$ 毎に独立に考えていい。

$A,B,C$ における $i$ 個目の 1 の出現位置をそれぞれ $p_a,p_b,p_c$ とする。 $f(x)=|p_a-x|+|p_b-x|+|p_c-x|$ を最小化するには、3つの中で2番目に大きい値を $x$ とするとよい。

∵それより増やすと、1増やすごとに1個以下との距離が1近づき、2個以上との距離が1離れるので、必ず $f(x)$ は大きくなる。 減らす場合も同様。

各 $i$ について $x$ を求め、それを $D$ における $i$ 個目の 1 の位置とすればよい。

Python3

B - Know Your Place

問題文

  • 長さ $N$ の非負整数列 $A=(A_1,A_2,\ldots,A_N)$ が与えられます。
  • $A$ の要素を並べ替えて得られる数列 $B=(B_1,B_2,\ldots,B_N)$ であって、すべての$i=1,2,\ldots,N$ について次の条件を満たすものが存在するか判定し、存在する場合はそのような数列を $1$ つ構成してください。
    • $B_i$ は、$1\le j\lt i$ かつ $B_j\lt B_i$ を満たす整数 $j$ の個数に等しい。

制約

  • $1\le N\le 5\times 10^5$
  • $0\le A_i\lt N$
  • 入力される数値はすべて整数

解法

$A$ は一旦無視して(あらゆる値があることにして)、$B$ で各 index に置くことができる値で樹形図を書いてみる。

i 0   1   2   3
  0---0---0---0 ...
  |   |   `---3
  |   `---2---0
  |       |---2
  |       `---3 
  `---1---0---0
      |   `---3
      |---1---0
      |   |---1
      |   `---3
      `---2---0
          |---1
          |---2
          `---3

これを元に観察と考察をすると、index $i$ には

  • $i$ より大きい値は置けない。(左にある数の個数がそもそも足りないので当然)
  • $i$ はいつでも置ける。(左には $i$ 個の数があり、1つ上の条件より、それらは全て $i$ 未満の数なので)
  • $i$ 未満の数 $a$ は、「index $[a, i)$ の範囲には、$a$ 未満の数を置いていない」ときに置ける。
    • (index $a$ より左にあるのは必ず $a$ 未満の数で、それだけで $a$ 個あるので、そこから増えてはいけない)

よって、「置ける中で最も大きい数から置いていく」以下の解法が成り立つ。

  • 大きい方から取り出すヒープキュー $Q$ を用意する。
  • $i=0,1,...,N-1$ の順に、以下を行う
    • $Q$ に $i$ を、$A$ に出現する個数だけ追加する
    • $B_i=Q.pop()$ とする。$Q$ がこの時点で空なら不可能

Python3

programming_algorithm/contest_history/atcoder/2026/0816_arc227.txt · 最終更新: by ikatakos
CC Attribution 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0