「2019-2020 XX Opencup GP of Tokyo」Yosupo's Algorithm

link。


一个重要的性质:

如果 \(\max(r^y_1, r^y_2) < \min(b^y_1, b^y_2)\)(即 \(r_{1, 2}, b_{1, 2}\) 之间都合法),且 \(r^w_1 < r^w_2, b^w_1 < b^w_2\),则点对 \((r_1, b_1)\) 不会成为答案。

理解:如果 \((r_1, b_1)\) 成为答案,则 \((r_2, b_2), (r_1, b_2), (r_2, b_1)\) 都要在异侧,而这是不可能的。

这可以帮助我们排掉许多无用点对。

\(y\) 坐标分治,可以说明最终有效点对的一个界为 \(O(N\log N)\),直接二维数点即可做到 \(O(N\log^2N + Q\log N)\)

然而这并不是最紧的界。可以考虑如下的算法,它将有效点对的上界缩到了 \(O(N)\)

将红点按 \(w\) 排序,蓝点按 \(y\) 排序。从大到小扫描红点,每个红点对应合法蓝点为一个后缀。

扫描到某一红点,之前曾经合法的蓝点中只需取 \(w\) 最大的;之前一直不合法的蓝点全部和当前点配对。

简单分析可得最多 \(O(N)\) 个有效点对。

最终可以做到 \(O((N + Q)\log N)\) 的复杂度。

由于我代码常数太大,跑得还是没有之前的复杂度快,十分丢人。

posted @ 2021-05-01 13:55  Tiw_Air_OAO  阅读(403)  评论(0编辑  收藏  举报