一些知识点的整理

O(nlogn)求通常幂多项式的不定和式

即给定多项式k=0n1akxk,求k=0n1akSk(x)的系数。其中Sk(x)=i=0x1ik

考虑从奇怪的角度出发:

nk=k![xk]enxi=0n1ik=k![xk](i=0n1eix)

其中i=0n1eix可以用等比数列求和公式简化为enx1ex1。发现分母和求和指标i是无关的,我们尝试将其分离。但是由于ex1常数项为0无法直接分离,所以我们考虑在等式右边乘以x,将xex1分离。即:

i=0n1ik=k![xk]enx1ex1i=0n1ik=k![xk+1]x(enx1)ex1i=0n1ik=k![xk+1](xex1(enx1))

实际上xex1就是伯努利数的指数生成函数,我们将其简记为B

那么我们直接展开两个多项式相乘的系数,可以得到:

i=0n1ik=k!j=0k+1Bk+1j[xj](enx1)i=0n1ik=k!j=1k+1Bk+1j[xj]enxi=0n1ik=k!j=1k+1Bk+1jnjj!

于是可以得到:

i=0x1ik=k!j=1k+1Bk+1jxjj!

回代到原式可得:

k=0n1akSk(x)=k=0n1akk!(j=1k+1Bk+1jxjj!)=j=1nxj1j!(k=j1n1akk!Bk+1j)

直接进行卷积即可。

板子题:洛谷P3711 (opens new window)

点分治中降低复杂度的一种方法

有时点分治的过程要求我们求出从分治部分的根到重心的信息,如果直接做通常会成为复杂度瓶颈,使复杂度多一个log之类的。但是考虑到在递归至子树的时候我们已经做了一部分这样的问题了,我们也许可以利用这些结果来降低复杂度。设重心为x,考虑从重心的父亲y开始统计,可以发现y到划分给y的连通块的根z的这段路径已经统计好了,结果直接利用,但此时由于zy递归求解了因此z本身并没有存下更远的路径的信息。但是z的父亲一定是离y最近的既是y的祖先又是点分树上y的祖先的点,于是它一定统计了更远的路径,并且它负责的连通块size至少是y的两倍。于是我们在目前的基础上添加zz的父亲的信息以及z的父亲到所属连通块的根的信息即可。我们可以不断合并这些信息直到到达x的根为止。

详情可以见例题UOJ #23 (opens new window),只不过这道题是仙人掌,可能有些丑陋。其实thusc2018有一道更好的题,可以用点分治加上面的技巧在O(nlog2n)的时间内解决(不用这个方法则是O(nlog3n)的),做到了和标算一样的复杂度。有兴趣的可以上网搜一搜题目。

最小割的一种建图方法和个人理解

最小割模型中一条ST的路径上的边可能会被割大于一条的数量,如果想要限制这条路径最多只割一条边,可以给这条路径加上容量为的反向弧。

个人感觉最小割其实是在做一种类似2SAT的问题,只不过最小割可以求出代价最小的一种方案(2SAT的代价只能是),但不可以支持两个条件同时为真/假时需要付出代价的限制(但如果这类代价只会在两个不交的集合之间发生显然可以黑白染色后再用最小割做)。所以假如你感觉题目是在让你求一个有代价的2SAT问题,而数据范围又不大的时候,基本可以往最小割方向想了。

一种吊打(?)cdq分治的离线统计法

cdq分治可以用于解决一类“贡献独立,允许离线”的统计性问题。主要思想是通过对时间分治消除时间的影响,只需静态的统计前半部分的插入对后半部分询问的影响就可以了。不过,对于同样贡献独立,但是允许删除的问题,cdq分治有时就会失效。但是此时我们可以考虑更换一种分组统计的方法,建立时间线段树。此时一个插入操作对一段区间有效。对于时间线段树上的每个节点,我们静态统计包含这个区间的所有插入操作对这个区间中的询问的贡献。这样我们就可以支持删除操作,复杂度和cdq分治还是一样的。

图的四元环计数

当然由于数量很多肯定是不能随心所欲的计数的。通常四元环的贡献是边权的乘积,就以这个为例。可以像三元环计数一样,枚举所有xyz的路径。我们在z中记录当前所有不同的yxyz的路径的权值和,在又一次枚举到z的时候将贡献相乘统计进答案里就可以了。复杂度也是O(mm)的。

利用四毛子优化常数时间复杂度

有时候我们对一个对象计算答案的时候需要递归到更小的情况,这样的复杂度可能稍微超出限制。但是考虑到递归至极小的情况(比如O(logn)的级别)的时候本质不同的情况不会很多,我们可以预处理它们以直接获得答案,减少递归次数。

通常可以令复杂度除以log