日本レジストリサービス(JPRS)プログラミングコンテスト2025#1(AtCoder Beginner Contest 392)F,G問題メモ

F - Insert

問題文

  • 空の配列 $A$ があります。 $i=1,2,\ldots,N$ の順に以下の操作を行います。
  • 数 $i$ を、$A$ の前から $P_i$ 番目の位置になるように挿入する。
    • より正確には、「$A$ の $P_i-1$ 項目まで」「 $i$ 」「$A$ の $P_i$ 項目以降」をこの順に連結したもので $A$ を置き換える。
  • 全ての操作を終えた後の $A$ を出力してください。

制約

  • $1 \leq N \leq 5\times 10^5$
  • $1 \leq P_i \leq i$
  • 入力は全て整数である

解法

以下の例で考えてみる。

i   1 2 3 4 5 6
P   1 2 2 1 3 2

■A の作られ過程
1   1
2   1 2
3   1 3 2
4   4 1 3 2
5   4 1 5 3 2
6   4 6 1 5 3 2

わかりやすいところでは、 例えば最後の $i=6$ は、挿入後、(最後なので当然)自身の前に割り込む要素がないので、 最終状態でも $P_6=2$ の示す通り、先頭から2番目の位置に置かれている。

$i=5$ は、挿入後、$i=6$ という1つの要素に割り込まれるので、最終状態では $P_5+1=4$ 番目に置かれている。
基本的には $i$ が大きい方が、自身の処理後に割り込む候補となる数が少ないので、考えやすそうである。

$i$ の大きい方から処理することを考えると、以下のような問題に言い換えることができる。

  • 長さ $N$ の配列 $A$ があり、各要素は null で初期化されています。
  • $i=N,\ldots,2,1$ の順に以下の操作を行います。
    • $A$ の中の null のうち、先頭から $P_i$ 番目に $i$ を置く。
i   1 2 3 4 5 6
P   1 2 2 1 3 2

6   _ 6 _ _ _ _
5   _ 6 _ 5 _ _
4   4 6 _ 5 _ _
3   4 6 _ 5 3 _
2   4 6 _ 5 3 2
1   4 6 1 5 3 2

SortedSetなど、「$i$ 番目の要素を取得する」「要素 $x$ を消す」という2つの処理を行えるデータ構造で実現できる。
最初、$S=\{1,2,...,N\}$ としておいて、$i$ ごとに以下をすればよい。

  • $S$ の残っている要素の $P_i$ 番目を取得する。$k$ とする。
  • $A_k=i$ とする。
  • $S$ から $k$ を削除する。

Python3

G - Fine Triplets

問題文

  • 整数 $A,B,C$ ( $A \lt B \lt C$ ) が $B-A = C-B$ を満たす時、 $(A,B,C)$ を 良い三つ組 と呼びます。
  • $N$ 要素からなる正整数の集合 $S=\{ S_1,S_2,\dots,S_N \}$ が与えられるので、 $A,B,C \in S$ なる良い三つ組の個数を求めてください。

制約

  • 入力は全て整数
  • $1 \le N \le 10^6$
  • $1 \le S_i \le 10^6$
  • $S$ の要素は相異なる

解法

仮に以下が分かっていたとすると、

  • $P[i]:=$「$A+C=i$ となる $(A,C)$ ペアの個数」

$B$ を固定したときの良い三つ組の個数は、$P[2B]$ で取得できる。

そして $P$ は畳み込みで求められる。

  • $F[i]:=i$ が $S$ に含まれるなら1、それ以外は0

$F$ 同士を畳み込んだ数列を $G$ とすると、$G[i]=2P[i]+\alpha$ となる。
$\alpha$ は、$i=2B$ となる $B$ が $S$ に含まれる場合 $1$、それ以外は $0$ となる変数とする。

($(A,C),(C,A)$ で2回数えられる分と、$(B,B)$ 自身が1回数えられている分)

ここから $P$ が求められる。

Python3

programming_algorithm/contest_history/atcoder/2025/0208_abc392.txt · 最終更新: 2025/02/08 by ikatakos
CC Attribution 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0