zhengrui集训D1-D5笔记

Day_1 计数

它咕掉了

Day_1 序列数据结构

它咕掉了

Day_2 线性代数

Large{高斯消元}

普通版:略

模质数:求逆

模合数:exgcd

Large{逆矩阵}
AA1=I=[100010001] AA^{-1}=I=left[ egin{matrix} 1 & 0 & cdots & 0 \ 0 & 1 & cdots & 0 \ vdots & vdots & ddots & vdots \ 0 & 0 & cdots & 1 \ end{matrix} ight]
怎么求:高斯消元,左边消元的过程中对应修改右边的矩阵。

有何用:解一个或多个形如Ax=bAcdot x=b的方程(两边同时乘上A1A^{-1}bb为向量

​ 多个也可理解为解Ax=BAcdot x=B的方程。BB为矩阵

[ 例 1 ] 一个图有nn (500le500) 个点,有kk个关键点,求对所有的(i,j)(i,j),从关键点ii出发随机游走,到达的第一个另外的关键点是jj的概率。

Large{矩阵快速幂}

[ 例 2 ] UOJ #200 【CTSC2016】NOIP十合一

Large{行列式}
A=[abcdefghi] A=left[egin{array}{} a & b & c \ d & e & f \ g & h & i end{array} ight]

D=A=det(A)=abcdefghi D=|A|=det(A)=left|egin{array}{} a & b & c \ d & e & f \ g & h & i end{array} ight|

det(A)=σSndet(A)=sum_{sigma in S_n}ff

det(AB)=det(A)det(B)det(AB)=det(A)cdot det(B) "ABAB"是矩阵乘法

余子式:MijM_{ij}=除去i行j列的行列式

k阶主子式:选kkkk列(标号一样)拿出来组成的k×kk×k的行列式

代数余子式:Cij=(1)i+jMijC_{ij}=(-1)^{i+j}cdot M_{ij}

det(A)=Cijaij o det(A)=C_{ij}cdot a_{ij}

怎么求:高斯消元

nnnn维向量组成的单纯形超空间体积值为:det1n!detcdot frac{1}{n!}

​ 如三维体积为V=16x1y1z1x2y2z2x3y3z3V=frac{1}{6}left|egin{array}{} x1 & y1 & z1 \ x2 & y2 & z2 \ x3 & y3 & z3 end{array} ight|

Large{矩阵树定理}

矩阵KK=度数矩阵DD-邻接矩阵AA

det(K)det(K)的任何一个n1n-1阶主子式的值都是是生成树的个数。

若有向图,则:

AijA_{ij}表示i到j的边的相反数,GiiG_{ii}表示i的入度,行列式det(K)det(K)MiiM_{ii}表示以ii为根的外向树数。

AijA_{ij}表示i到j的边的相反数,GiiG_{ii}表示i的出度,行列式det(K)det(K)MiiM_{ii}表示以ii为根的内向树数。

BESTLarge{BEST定理}

ec(G)ec(G)表示欧拉路径的数量,deg(v)deg(v)表示点vv的入度(入度和出度要相等), ts(G){t}_{s}(G)表示以ss点为根的外向树的个数。有 ec(G)=ts(G)vV(deg(v)1)!large ec(G)=t_s(G)prod_{vin V}(deg(v)-1)!

Large{带状矩阵}

带状矩阵即在矩阵A中,所有的非零元素都集中在以主对角线为中心的带状区域中。

带状矩阵高斯消元时间复杂度O(nD2)O(nD^2)DD为带宽。。但高斯消元时要向右找非零的数。

线Large{线性空间}

一转 线性空间

二转 线性空间理解

线Large{线性基}

三转 线性基

[ 例 3 ] WC 2011 最⻓路

Large{拟阵}

(Cramer)Large 克莱姆(Large Cramer )法则

解线性方程用,略

Large{伴随矩阵}

矩阵A的伴随矩阵是A的余子矩阵的转置矩阵,即:adj(A)=CT[adj(A)]ij=Cjiadj(A)=C^T o [adj(A)]_{ij}=C_{ji}

作为拉普拉斯公式的推论,关于n×nn×n的矩阵AA的行列式有:

Aadj(A)=adj(A)A=det(A)IAadj(A)=adj(A)A=det(A)I

Large 判断二分图是否存在完备匹配

若存在,积和式,行列式均不为0。(邻接矩阵,相连的为x部标号,不相连的为0)

Tutte MatrixLarge Tutte Matrix

自闭

dlsnb

Day_3 图论

[ 例 1 ] NOI2019 D2T1

O(nlog2(n)/nlog(n)α(n))O(nlog^2(n)/nlog(n)alpha(n))

[ 例 2 ] n个点,m条边DAG,求删去每个点后1->n的最短路。

n,m 3e5

定义fif_i表示1i1 o i的最短距离,gig_i表示ini o n的最短距离。

拓扑序枚举,对于xx,拓扑序为d(x)d(x),答案为

mind(u)<d(x)<d(v)fu+gv+w(u,v)large min_{d(u)<d(x)<d(v)}f_u+g_v+w(u,v)

[ 例 3 ] 给n个点m条边的有向图,计算每个点传递闭包大小,最多答案差两倍。(Ans/2 <= ans <= 2Ans)

n,m 2e5

例3 题解 :随机,O(n)O(n) 拓扑传最小值fffi=1n+1n=1fi1f_i=frac{1}{n+1} o n=frac 1{f_i}-1,多做几次精度就准了。

[ 例 4 ] SD省队集训D1T1

n点m条无向边,第i条边花费为2^i,要经过每一条边至少一次,且回到原地,求最小花费时间。

最小生成树,贪心调整…

题解

题解

建议看P4494 HAOI2018 反色游戏

[ 例 5 ] Hihocoder Challenge 28

n,k <= 50,e_w <= 1e9, 求所有生成树权值和的k次方和

把矩阵树定理中的数的空间拓宽到kk次多项式并且用求逆元的方法消元。
注意如果kk过大就直接代入0..n0..n插值了。

copy的,不会

[ 例 6 ] 最小方差生成树 N 300 M 1e5 wi 1e18

暴力:枚举权值和(平均值)做MST,时间复杂度O(mlog(m)wi)O(mlog(m)sum w_i)

暴力2:本质不同的边排列顺序只有m2m^2种(只有经过两值中点才会交换顺序),直接枚举然后MST,时间复杂度O(m3log(m))O(m^3log(m))

发现当随着平均值σsigma枚举增大,(wiσ)2(w_i-sigma)^2是形状相同,顶点在x轴上,开口向上的二次函数,一条边如果被后面的其他边替换掉就再也不会回来。

按区间从小到大来求,在两条边大小关系改变时,考察能否用新的小边替换大边使得还是一棵树,也就是不断调整最小生成树,用LCTLCT维护,由于改变次数 O(m2)O(m^2),所以时间复杂度 O(m2log(m))O(m^2log(m)),但LCTLCT常数很大。

暴力3:可以发现一条边出现在最小生成树中一定是一段区间,记作[li,ri][l_i, r_i],可以用并查集维护最大生成树求出。求出l,rl,r后,得到O(m)O(m)个时间点,从小到大扫,在lil_i处加入边ii,在rir_i处删除ii。不用维护树的形态。时间复杂度O(m2log(m)))O(m^2log(m)))

正解:维护树的形态,用LCTLCT维护最大生成树,加入一条边如果不连通,lil_i就是inf-inf,联通就在路径上查询边权最小的边j,让li=wi+wj2l_i=frac{w_i+w_j}2,弹出一条边的时候求出rjr_j。求出来后用暴力3的方法求答案,时间复杂度O(mlog(m))O(mlog(m))

详见《ioi2018候选集训队论文<最小方差生成树>命题报告 何中天》

[ 例 7 ] [ 2-sat ] n个点,m条边,k个点的集合,每个点只属于一个集合。要在每个集合恰好选一个点,使得每一条边恰好有一个被选择。

问题就在如何保证一个集合只选一个,对于每个前缀后缀建辅助点,就可以建图了,类似于优化建图吧

[ 例 8 ] [ 2-sat ] n个点(x_i,y_i),每个点要可以建一个建筑,这个建筑是以该点为斜边的等腰直角三角形,斜边必须平行于x/y轴,所有建筑边长必须一样长。问最大边长。n <= 60

二分答案+拆点2sat 水

[ 例 9 ] [ 2-sat ] TCO Hard

大小为n的树给出,有m个物品,给每个物品确定一个位置p[i],使得k个形如“以p[x]为根,p[y]和p[z]的LCA是点Q”的限制被满足。

[ 例 10 ] CF 547D

n个点(x,y),对点黑白染色,使得每行每列都满足,|B-W|<=1,输出一种方案

n <= 2e5 x,y <= 2e5

先考虑<=0,对行列建点。有一个点就行列连边,是一个二分图,跑欧拉回路,从X部到Y部看作黑点,反之白点就行了。

考虑<=1,两边可能有奇点,没有欧拉回路,我们两边分别建一个虚点,向对方的奇点连边,奇点一定是偶数个(两边相等),所以直接跑欧拉回路。每个行/列最多连一条虚边,所以<=1。

也可以直接把奇点两两配对跑欧拉回路。

[ 例 11 ]n个点,m条边,可能有重边,对于这个图的边集的子集(2^m个),导出的子图的每个联通块内部都存在欧拉回路,我们就把答案加上这个子图的边数的平方,答案对1e9+7取模。n 1e5

先考虑答案+1,把m条边是否选看作变量,由于要deg为偶数,所有相当于异或为0,则有n个方程。

任意取这个图的生成树,这个秩是<n的,因为所有异或起来为0。

如果有一个n-1阶的小矩阵的行列式不为0,则秩为n-1,整个的秩也就>=n-1。一棵生成树去除根后是n-1*n-1的,剩下的经过一些变换后可以恰好是matrix-tree的形式,行列式绝对值为1(树的生成树为1)不为0,所以证到了m这n个方程的秩为n-1

然后…自闭

又线代了

dlsnb

wjznb

Day_3 字符串

SAMLarge SAM

[ 例 1 ] Bzoj 4556 [Tjoi2016&Heoi2016]字符串

给出字符串S,每次给出a,b,c,d,询问S[a,b]的所有子串和S[c,d]的最长公共前缀的最大值。

博客

[ 例 2 ] Bzoj十连测第五场 B 可持久化字符串​

主席树维护next

倍增

[ 例 3 ] Bzoj 4310

SAM+二分+hash

[ 例 4 ] Fim1

给定字符串S,维护一个字符串序列T,有3种操作

1.T.append(T[x]+c)

2.T.append(c+T[x])

3.询问T[x]在S[l:r]中的出现次数

|S|,M <= 1e5

SAM+线段树合并

[ 例 5 ]

区间本质不同子串个数

区间本质不同回文串个数(貌似有在线根号算法)

(离线)

SAM

回文树(没学,自闭)来个博客

[ 例 6 ] CF700E

一个字符串对另一个字符串是好的当且仅当这个字符串在另一个字符串里出现了两次

给定字符串S1

求最大的k使得字符串序列S1,S2,…,Sk满足Si+1对Si都是好的。

对于i>1,Si+1一定是Si的一个后缀。所以只需二分长度,然后在SAM上,查询一个串在另一个串中出现次数是否大于2。至于怎么查,不知道。博客

[ 例 5 ] 给定字符串S,定义plcp(i,j)为最长回文公共前缀。

F(x)=1ix1jxplcp(i,j)large F(x)=sum_{1le ile x}sum_{1le jle x} plcp(i,j)

每次在S后添加一个字母c,输出F(|S|)

考虑F(S)F(S1)F(|S|)-F(|S|-1),就是回文树上最后一个字母代表的节点与其他所有节点的LCA的长度和…

回文树。不会。

[ 例 6 ] 求一个字符串的所有字串中,任选2个(可以相同),计算(A+B2LCA(A,B)L)sum(|A|+|B|-2LCA(A,B)le L)

N <= 1e5, 串伪随机(其实不伪随机也可以做)

问题也就是询问该串的后缀树上,长度不超过L的…

[ 例 7 ]Deep Purple

多次询问区间LBorder(L:Largest) 1e5

把求border转化为求period…

博客

[ 例 8 ] NOI赛前集训-D6T2

。。。

LyndonLarge Lyndon串

对于字符串SS,如果SS的最⼩后缀是他本身,那么SSLyndonLyndon串。

ssLyndonLyndon串等价于ss本身是其循环移位中最小的⼀ 个

LyndonLarge Lyndon分解

存在性

唯一性

DuvalLarge Duval算法

[ 例 9 ] 2019NOI赛前集训 D6T3

[ 例 10 ] Fim4

Day_4 ACM

ACM赛

做了4道水题,Freopen巨佬做了5道题 -> 排名6 (最高排名 2)

Day_5 树上数据结构

Large 点分治

【例1】Luogu2056 [ZJOI2007]捉迷藏

树,点权0,1

每次修改一个点点权,询问两个最远1的距离

法1:括号序列 蒟蒻博客

法2:对于传统树分治做法,就是在每个树分治的分治中心上开个堆维护一下:

• 每个子树一个堆维护到其的最大距离

• 再开个堆维护上面那个堆的前2大值

• 再开个堆维护全局的最大值

• 然后每次暴力更新即可,总复杂度O( (n + m)log^2n )

【例2】Bzoj 2566 xmastree

和之前那个题差不多,对每个颜色分别维护即可

【例3】Bzoj 4372 烁烁的游戏

点分治

【例4】[Zjoi2015]幻想乡战略游戏‘

点分

【例5】[Ynoi2012]D1T3

点分

【例6】floj307 不可知圆环 CF1010F

点分 生成函数 。。

【例7】[Ynoi2012]D2T3

一棵树,支持1.链上所有点加k,2.查询距离一个点<=1的所有点的点权的kth小

【例8】UOJ#191 Unknown

有一个元素为向量的序列S,下标从1开始,初始时S为空,选在你需要支持3种操作:

1.在S末尾添加一个元素(x,y)

2.删除S的末尾元素

3.询问下标在[l,r]区间内的元素中,(x,y)×Si的最大值

其中×表示叉积

5e5

做法:1.变成一颗树,树剖+线段树维护凸包 (log3),加上某种优化,就log2了

2.见题解

【例9】n个点的树,q次操作

1.修改点权

2.问当前最大权值联通块

LCTLarge LCT

。。。

DPLarge 动态DP

【例1】NOIP2018D2T3

【例2】有n个人,编号为0到n-1,每个人手上有一个ai

会进行n轮(从0开始)游戏,最开始有一个数x=0,第i轮轮到第i个人时,第i个人可以选择是否把x变成(x+ai)%n

n轮之后编号为x的获胜。每个人只会采取如下策略:只有当变了x后必胜,不变x不必胜的情况下,他才会在他这轮变动x。

每次修改一个ai,问谁获胜。

可以发现只会有一个人会动,且只有遇到的数为(i-ai)%n时才会动。

前i个人肯定不会让x大于等于i。然后我们将i向(i-ai)%n < i 的连边。形成森林。

是一个开枪游戏

如果0活下来就是0

否则是开枪干掉0的编号最小的人

【例3】[CodeChef Pushflow]

n个点的图,每个点最多属于一个简单环,边有边权。

m次操作,询问两个点之间最大流或者修改一条边边权

一个 log 博客

LCT/树剖

【例4】[WineDAG’s prevention]

n个点的树,q次操作,增加一个点权;翻转一条路径,询问路径和/MAX/MIN

两棵Splay,一棵维护形态,一棵维护权值

【例5】CFRound545 F Matches Are Not a Child’s Play

LCT 区间赋值

【例6】有三部分点A,B,C,各有n,n1,n2个点。

其中A,B构成一棵树,A,C构成一棵树,A内部没有边。

随机i,j把B1Bi,C1Cj都删了,A仍然联通的概率

N 1e5

i递增的时候j递减,用LCT维护删除时间最小生成树

//////////////////////////////

11111111111111111111

22222222222222222222

33333333333333333333

44444444444444444444

55555555555555555555

66666666666666666666

77777777777777777777

88888888888888888888

99999999999999999999

10101010101010101010

Day_5 生成函数及多项式

【例1】求出 A = {0,1,4,…,n^2,…}的生成函数

1+x+x2+x3+...+xn+...=11x1+x+x^2+x^3+...+x^n+... = frac 1{1-x}

1+x+2x2+3x3+...+nxn+...=1(1x)21+x+2x^2+3x^3+...+nx^n+...=frac 1{(1-x)^2}

1+x2+x4+...+x2n+...=11x21+x^2+x^4+...+x^{2n}+...=frac 1{1-x^2}

【例2】4种球,每种无限个,要选出n个球。n很大,要满足:

红球只能选偶数个

黄球只能选5的倍数个

蓝球最多只能选4个

绿球只能选1或0个

R(x)=1+x2+x4+...R(x)=1+x^2+x^4+...

Y(x)=1+x5+x10+...Y(x)=1+x^5+x^{10}+...

B(x)=1+x+x2+x3+x4B(x)=1+x+x^2+x^3+x^4

G(x)=1+xG(x)=1+x

Large 指数型

1+x+x22!+x33!+...=ex1+x+frac{x^2}{2!}+ frac{x^3}{3!}+...=e^x

1+x22!+x44!+...=ex+ex21+frac{x^2}{2!}+frac{x^4}{4!}+...=frac{e^x+e^{-x}}2

x+x33!+x55!+...=exex2x+frac{x^3}{3!}+frac{x^5}{5!}+...=frac{e^x-e^{-x}}{2}

Large 一维循环卷积

FFTFFT

Large 二维循环卷积

对每一维进行DFTDFT

FWTLarge FWT

就是k维循环卷积

【例3】n点m边有向图,边权是二元组(ai,bi),你身上有一个二元组(a,b),每经过一条边,二元组会变成((a+ai)%n,(b+bi)%n-1)。另外给定一个k,对于每个点i,以及二元组(x,y),你要求从i点出发,经过恰好k条边回到i,且二元组变成了(x,y)的方案数。答案对1163962801取模。

n<=22,m<=10000,k<=1e9

把一个n×(n-1)的矩阵设置为类型Mat,Mat的乘法运算定义为二维循环卷积,那么这个图的转移矩阵事实上就是一个n×n的以Mat为值的矩阵,并且可以发现,由于Mat的运算满足交换律,分配律还有结合律,所以转移矩阵的乘法同样可以当成正常矩阵乘法来做。现在我们要做的就是加快这个矩阵乘法的效率。

…没抄完

1163962801 - 1 = 1163962800 = 2^4 * 3^2 * 5^2 * 7 * 11 * 13 * 17 * 19

所以1~10都是它的原根。。。?

【例4】一个TC Hard

一个n次多项式P(x),且满足[x_i]P(x)=[x_n-i]P(x)

[x^i]表示第i项的系数

现在告诉你P(x)^2在mod x^n 意义下循环卷积的值

求P(x) n <= 40

【例5】给你一个M个点的图,图中任意一条从S到T的长度为K的倍数的路径会对答案造成(nLen)inom{n}{Len}的贡献,Len为路径长度。路径可以经过重复的边,答案对P取模。

M <= 10 K <= 1000 P $equiv$1(mod K),N <= 1e18

组合数贡献可以通过加自环去掉,也就是Len时间再走,其他时间走自环/休息,那么每天路径的贡献都是1。这样的话自环不能算作路经长度。

【例6】染色问题 m种颜色 染n个点的环,要求第i种颜色恰好染ci次,求本质不同的方案数。

…生成函数 burnside引理/Polya定理

Large 牛顿迭代

Large 泰勒展开

Large 多项式求逆

Large 多项式除法

LnLarge 多项式Ln

expLarge 多项式exp

多项式多点求值

多项式多点插值

【例7】拆分数的nlog做法:生成函数->多项式exp

原文地址:https://www.cnblogs.com/Orz-IE/p/12039256.html