数据结构优化建图

2023ICPC网络赛2B 分治

看到1e5给10s以为是根号log的做法,一直在往小的块暴力,大的块O(n)建图想,但这并没有用。实际上有些常数的双log也可以很慢,还是不要根据数据范围把做法锁的太死!
考虑优化每个虫洞之内的建图,关键在于那个曼哈顿距离是不独立的。考虑只有一个绝对值怎么做:直接排序,相邻连边即可。那么两个绝对值就是二维偏序,考虑分治:
先按照一维(x)排序,每次连跨越分治中心的边;
这样x的贡献就是确定的,每个点复制出一个新点并连一条\(|x_i-x_{mid}|\)的边,然后复制的点之间再按照y升序相邻连边;
这样就能保证跨越两边的路径是对的,且在一边内的路径一定更劣。边数\(O(nlogn)\),总复杂度\(O(nlog^2n)\)

牛客03F 分治

图的性质是连边跨度在9以内,考虑如何利用:即在一个点走到另一个点的路径中,任意相邻的9个节点都至少有一个点被访问过;而如果能确定一个必然经过的节点,那就只需要通过预处理这个点到其它点的距离即可算出答案。

考虑分治,每次对区间中间的9个点算出在区间内走,到每个点正反的最短路,左右两边分治下去做。这样在询问时:如果两个点有一个点在中间,肯定没问题;否则如果两个点在左右两边,则路径一定经过中间9个点之一,枚举计算完返回;否则就是都在一边,这时路径有两种可能:一种是会跨到另一边(这就也会经过中间9个点之一),另一种是不跨过(就变成只考虑一边的问题)。

posted @ 2023-09-25 09:27  sz[sz]  阅读(7)  评论(0编辑  收藏  举报