🔫
FPS24 I - スコア 勉強メモ
問題リンク
問題文
整数からなる要素数
制約
- 入力される値はすべて整数
1 \leq N \leq 2 \times 10^5 1 \leq K \leq N 1 \leq A_i \leq 10^8 j \ne j \Longrightarrow A_i \ne A_j
解説
となります。
これは畳み込みの順序を マージテク することで、計算量
このマージテクは、以下のqueueを使ったアルゴリズムで簡単に実装できます。
- queue を
と初期化する。(f_1, f_2, \cdots, f_N) (f_i := 1 + A_i x) - queue の長さが
になるまで以下を繰り返す。1 - queue の状態を
に更新する。(直前の queue の長さを(f_1, f_2, f_3, \cdots, f_m) \to (f_3, f_4, \cdots, f_m, f_1 * f_2) とする。)m
- queue の状態を
- queue の唯一の要素
が求めたい多項式である。(f_1 * f_2 * \cdots * f_N)
各操作について次数が最小である
実装例(Python3)
# multiply(f, g) : 多項式 f と g を畳み込む
N, K = [int(s) for s in input().split()]
A = [int(s) for s in input().split()]
que = deque()
for a in A:
que.append([1, a])
while len(que) > 1:
f, g = que.popleft(), que.popleft()
res = multiply(f, g)
que.append(res)
res = que[0]
print(res[K])
所感
こんなところにもマージテクが出てくるのは感動した。天才っているもんだ。
Discussion