首先我們能夠發現,最終得到的答案 \(b\) 一定為下凸的。但是直接求凸殼肯定不行。具體地,答案的凸殼要滿足對於每個 \(x\),\(b_x\) 都是整數,即每段斜率都是整數。
可以發現找到能包住點集,最貼合的一個這樣的 \(b\) 陣列就是答案,因為題目給定的操作讓我們每次都只能擴充套件最貼緊的點。那麼我們先對 \(a\) 求出凸包,然後從 \(b_i\) 推到 \(b_{i+1}\)。即,我們需要找到 \((i,b_{i})\) 到 \(a\) 的凸殼的切線。由於 \(i\) 是遞增的,且得到的 \(b\) 也是推的,所以切點是遞增的,直接雙指標即可。總複雜度 \(O(n)\)。
https://atcoder.jp/contests/arc130/submissions/50443191