同じアトラクションに何回乗るのかを高速に求められれば十分.
Multiset としての和 \(B := \cup_{i \in N} \{1, \cdots, a_{i}\}\) を取る. \(B\) の元から,大きいほうから \(K\) 個まで取ってくるのが最善.
\(m \in \mathbb{N}\) に対して, \(Bool \ni f(m) := \) (\(B\) に含まれる \(m\) 以上の値は \(K\) 個以下) とする. \(C\) を十分大きな定数とする.\(C = max_{i \in N} (a_{i}) + 1\) など. 以下,最適なアトラクションの乗り方を高速に求める.
Case : \(\vert B \vert \leq K\)
このときは,\(B\) からすべて取ればよい. ちなみに \(f(0) = true, f(C) = true\).
Case : otherwise
\(f(0) = false, f(C) = true\). Binary search により,\(f(m) = true\) となる minimum な \(m\) が求まるので, それを \(m_{0}\) とおく.
各 \(i \in N\) に対して, if \(a_{i} \geq m_{0}\)のとき \(a_{i}, a_{i} -1, \cdots, m_{0}\) までを \(ans\) に加算して, \(K\) から \(a_{i} + 1 - m_{0} \) を引く.
\(i\) 毎の操作が終わった後,\(K > 0\) の場合は, 楽しさ \(m_{0} -1\) のアトラクションを \(K\) 回乗れる.
使っている記号,マクロ等 "https://ecsmtlir.hatenablog.com/entry/2022/12/23/131925"