其他分享
首页 > 其他分享> > 「2019-2020 XX Opencup GP of Tokyo」Yosupo's Algorithm

「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)\) 的复杂度。

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

标签:log,Algorithm,Tokyo,扫描,复杂度,Opencup,蓝点,合法,排序
来源: https://www.cnblogs.com/Tiw-Air-OAO/p/14724147.html