【学习笔记】[ABC308Ex] Make Q

一场比赛两个线段树分治

大概看了一下,题解的做法大多都比较脑洞

显然想到枚举不在环上的这个点,将其删去过后找最小环即可。因为是稠密图所以想到用 Floyd \text{Floyd} Floyd。这样我们得到了 O ( n 4 ) O(n^4) O(n4)的做法。

因为要删除一个点比较慢,所以考虑优化这个过程。我们发现 i i i [ 1 , i − 1 ] [1,i-1] [1,i1] [ i + 1 , n ] [i+1,n] [i+1,n]有贡献,这不就是一个节点出现的区间吗?考虑用 线段树分治 来优化它。这也能线段树分治?

发现插入一个点其实就是 Floyd \text{Floyd} Floyd的实现方式,因此直接做就完了

这里记住一个结论,用 Floyd \text{Floyd} Floyd维护两点间最短路,插入一个点是 O ( n 2 ) O(n^2) O(n2)的。

其实可以考虑优化一下空间。发现每次线段树分治遍历的都是一条链,所以直接用深度来存,这样空间复杂度就是 O ( n 2 log ⁡ n ) O(n^2\log n) O(n2logn)的。虽然 atcoder \text{atcoder} atcoder不卡空间。

复杂度 O ( n 3 log ⁡ n ) O(n^3\log n) O(n3logn)

你可能感兴趣的:(算法,数据结构)