I - K-th Largest Triplet Editorial
by
toam
解説3
\(A, B, C\) をそれぞれ降順ソートしておきます. \(f(i,j,k)=A_iB_j+B_jC_k+C_kA_i\) とします.
\[f(i,j,k)\geq f(i+1,j,k),f(i,j,k)\geq f(i,j+1,k),f(i,j,k)\geq f(i,j,k+1)\]
が成り立つことにより,答えとしてあり得る \((i,j,k)\) の組は \(ijk\leq K\) を満たします.よってこれらを満たす組 \((i,j,k)\) それぞれについて \(f(i,j,k)\) を計算し,この中で \(K\) 番目に大きいものを求めればよいです.
\(ijk\leq K\) を満たす組の個数は \(O(K\log^2K)\) 個あります.(\(K=5\times 10^5\) のとき \(48094156\approx 4.8\times 10^7\) 個です.) 長さ \(O(K\log^2 K)\) の列をソートするのはおそらく間に合いませんが,c++
であれば nth_element
を用いて \(K\) 番目に大きい要素を求めれば,高速な言語であれば間に合います.
補足:\(ijk\leq K\) を満たす組の個数が \(O(K\log^2K)\) であることは \(\displaystyle\int_1^K\left(\int_1^{K/x}\left(\int_{1}^{K/(xy)}1dz\right)dy\right)dx=O(K\log^2K)\) より従います.
posted:
last update: