题目:
求随机点分治的期望复杂度。
题解:
思路一开始就没对,应该往贡献的方向去思考的。
考虑一个点对(u,v),若u会对v产生影响,当且仅当u->v的路径上不存在被选中的点。而一条路径上所有的点被选中的概率是均等的,u被首选的概率为 1/(dis(u,v)+1) 。那么对v的期望贡献就是那么多。
那问题成功转化成
∑i,j<=n1/(dis(u,v)+1)
设D(i)表示为距离为i的点对个数。
那么以上式子可变为:
2∗∑i<=nD(i)/(i+1)
到了这步,D可以用点分治+FFT实现。
在点分治的过程中:
设g(i)为重心前面子树到重心中距离为i的点数,f(i)为当前子树到重心中距离为i的点数。
D(i)=∑j<=ng(j)∗f(i−j)
这里就用FFT加速。
在点分治的过程中,用最大树高为限制就可以保证复杂度,因为点分治的过程中,对应树高是不会超过对应子树大小的,这样就可以保证每层分治的清空总数量就是n的级别。所以,这题的复杂度为 O(nlog2n) 。
感觉自己的FFT还不慢,但是为什么自己的NTT那么慢呢……