一般难度模板复习

Stoer-Wagner算法

求无向图全局最小割的一种算法。设一张图(V,E)的点集为V,边集为E。我们说集合C是图(V,E)的割,当且仅当CE且存在V的一个划分ST,使得(u,v)CuSvT,一个割的权值wC就是割中边权的和。

考虑一个事实:对于任意两点s,tV,在一个割中s,t或在同一划分内,或在不同划分内。那么可以先考虑计算st割,再将s,t两点合并(s,t之间的边消去,连向其它点的边合并)并递归计算即可。

而Stoer-Wagner算法将告诉我们,总存在一对点s,t使得st最小割就是将t的所有边割除的情况。

考虑这样找到满足要求的s,t:设一个点集VV,初始情况下V为空。对于不在V中的点u,定义其权值为wV,u=vVw(u,v)。如果每次选择wu最大的u加入V(相同则随意),那么最后两个加入的点就是stt为最后一个点)。

证明:只要证对于任意一种stC,都有wCwV{t},t即可。令idak=kCk={(u,v)C|iduk,idvk}Vk={a1,a2,,ak}。将所有点按照加入V的顺序排成一个列{an},对于任意一种stC,设其对应的分划为S,T,我们称满足n>1[an1S][anS],即与前一个点不在一个分划内的点为活跃点,显然t为活跃点。对于任意一个活跃点v,我们证明wCidvwVidv,v即可。

采用归纳法,对于第一个活跃点v,不难发现wCidv=wVidv,v,对于之后任意活跃点v,设其前一个活跃点为u,将Cidv中的边分为三部分:Ciduu,v之间的点与v的连边(设这个集合为A),其他边。那么有:

wVidv,v=wVidu,v+wAwVidu,u+wAwCidu+wAwCidv

于是结论成立。

扩展中国剩余定理

显然只需要考虑合并两个同余方程的情况:

xa1(modb1)xa2(modb2)

第一个方程的通解为x=a1+kb1,kZ,代入第二个方程即有a1+kb1a2(modb2),改写为k1b1+k2b2=a2a1,利用扩展欧几里得求解即可。

回文自动机

对于一个字符串ss的回文自动机的每个节点代表s的一个回文子串(内容相同的字串在同一个节点上),另有两个特殊节点奇根和偶根。后文将不严格区分节点和其对应的回文串

回文自动机的节点p有如下基本属性: 1.lenp表示p的长度,特别的,奇根的len1,偶根的len02.failp表示p的最长回文严格后缀,特别的,如果没有回文严格后缀,则其fail为偶根;偶根的fail为奇根,奇根的fail为自己。 3.transp,c表示p在前后各加上字符c之后形成的新回文串。特别的,如果新回文串不是s的子串,则transp,c为偶根;奇根的trans节点代表单个字符c组成的回文串,偶根的trans节点代表两个字符c组成的回文串。

先证明回文自动机的一个性质:s的回文自动机节点数为O(|s|)。 证明:对于任意的s,对其前缀采用数学归纳法。s[1;0](空串)的回文自动机只有奇根和偶根,显然成立。 假设命题对s[1;k]成立,显然对于s[1;k+1]的回文自动机,其可能新增的节点都对应s[1;k+1]的回文后缀。假设其有非空的最长回文后缀t,那么t可能是回文自动机新增的节点,且其他s[1;k+1]的回文后缀也是t的回文后缀。 考虑t的回文后缀也是t的回文前缀,因此其必定出现在s[1;k]中,也就已经在原回文自动机上。因此回文自动机最多新增一个节点,命题对s[1;k+1]也成立。

下面考虑如何构造回文自动机。对于字符串s,先构造出s[1;|s|1]的回文自动机,再在此基础上继续构造。

我们记录s[1;|s|1]的最长回文后缀last(没有则为偶根),由之前命题的证明,我们只需考虑是否需要添加s的最长回文后缀。令s的最长回文后缀为t(没有则为空串),显然t[2;|t|1]一定是s[1;|s|1]的回文后缀,其对应节点p就是lastfail祖先(如果t为空串,定义p为奇根)。 那么考虑先找到p,只要在fail树上从p=last开始不断查找,就能按长度从大到小的顺序遍历last的所有回文后缀,找到第一个满足s[|s|lenp1]=s[|s|]的节点,就是满足要求的p。由于fail树的根为奇根,len1,因此这样的点总是可以找到的。

那么显然有transp,s[|s|]t,如果transp,s[|s|]已经存在,那么无需添加新的节点,记lasttransp,s[|s|]即可。 否则,令t的对应节点为np,并将transp,s[|s|]记为np。显然有lennp=lenp+2,且transnp皆为偶根。 再考虑找到failnp的问题。设t的最长回文严格后缀为t,可知t[2;|t|1]p的祖先,记为q。从failp开始向上找到第一个满足s[|s|lenq1]=s[|s|]的节点即为所需要的q,于是failnp就是transq,s[|s|]。最后将last设为np

最后证明构造回文自动机的复杂度。先归纳假设所有节点在fail树上的深度都不超过其trans父亲的深度+1。考虑增量时在fail树上找pq的过程,每次当前点的深度1。而最后failnpqtrans孩子,因此failnp的深度不超过q的深度+1,np的深度也就不超过q的深度+2。显然np深度不超过其trans父亲p的深度+1,归纳假设成立。由于深度的增量是O(|s|)的,向上查找pq的总复杂度也是O(|s|)的。如果字符集为常数,构造回文自动机的复杂度就为O(|s|)

图论经典问题

最大独立集=n最小顶点覆盖

因为一个点集是独立集等价于其补集是点覆盖。

二分图最小点覆盖等于最大匹配

分为两部分证明:先证任意匹配点覆盖。考虑一个匹配,对于任何一条匹配边,两端的点至少有一个在点覆盖中,且匹配边点不重复,故命题成立。

下面用最大匹配构造一个点覆盖。考虑对右半部分的每个未匹配点尝试增广,由于是最大匹配必定增广失败。将增广完毕后,左半部分访问过的匹配点和右半部分未访问的匹配点作为一个点集,先证明这个点集大小为最大匹配:由增广的特性,对于一条匹配边,在左半部分的点被访问后立即会访问右半部分的点,否则均不访问,因此命题成立。再证这是一个点覆盖:对匹配边来说是显然的,对于非匹配边,若其右半部分点被访问,则其一定被尝试增广过,故左半部分的点一定是匹配点(否则就增广成功了),于是左半部分是点集中的点;若其右半部分的点未被访问,由于每个没匹配的右半部分点都被增广过,因此这个点是匹配点,也在点集中,证毕。

证法2:二分图建成网络流,边的流量为无穷,最小割就是最小点覆盖。我又白证了一堆东西QAQ

一种代替(吊打?)单调队列的方法

一般难度模板复习× 一般难度模板预习√ 在学弟x义x的博客中看到的,我自作主张简称它为扩展单调队列。 可以解决这样的问题:维护一个队列,并支持查询队列中的所有元素对一个运算的和,满足结合律,单次快速计算,但不一定有逆运算。支持强制在线(狂喜) 可以发现如果是数字的取max,那就是单调队列板子题,但一般的运算不一定满足max这样好的性质。 扩展单调队列方法如下:取一个队列中的关键位置x,维护所有x的后缀和x+1的前缀和,加入元素只要更新前缀和即可,也支持快速查询。 但是关键位置可能被弹出队列,此时我们重新将关键点x设置为右端点,并重新计算所有x的后缀和。注意到此时被计算后缀和的位置在下一次重设关键点时一定都被弹出了,所以只会对这一次重构产生贡献,总复杂度就是线性的。

拉格朗日反演

G(x)F(x)的复合逆,则拉格朗日反演式如下:

[xn]H(G(x))=1n[xn1]H(x)(xF(x))n

证明:

为方便没有抽象代数基础的OIer们理解,增加一些合理的定义:

形如F(x)xk(k>0,[x0]F0)的多项式在通常意义下不可逆,但如果将x的指数范围从非负整数扩展到整数,我们可以认为:

1F(x)xk=xkF1(x)

同样可以定义扩展后的多项式的导数,有一个性质是[x1]F(x)0

根据上面的定义,我们只要证明一个更简洁的式子:

[xn]H(G(x))=1n[x1]H(x)Fn(x)

考虑设[xi]F(x)=ai[xi]H(G(x))=bi,对等式i0biFi(x)=H(x)两边求导得:

i0biiFi1(x)F(x)=H(x)

于是有:

[x1]i0biiFin1(x)F(x)=[x1]H(x)Fn(x)

又:

[x1]i0biiFin1(x)F(x)=[x1]bnnF1(x)F(x)+i0,in[x1]biiFin1(x)F(x)=[x1]bnnF1(x)F(x)+i0,in[x1]bii(Fin(x)in)=[x1]bnF1(x)F(x)=[x1]bnnx1xF(x)F(x)=[x0]bnnxF(x)F(x)=[x0]bnn(1a1a2a12x+)(a1+2a2x+)=bnn

于是就证明了拉格朗日反演。