Day_1 计数
它咕掉了
Day_1 序列数据结构
它咕掉了
Day_2 线性代数
普通版:略
模质数:求逆
模合数:exgcd
怎么求:高斯消元,左边消元的过程中对应修改右边的矩阵。
有何用:解一个或多个形如的方程(两边同时乘上)为向量
多个也可理解为解的方程。为矩阵
[ 例 1 ] 一个图有 () 个点,有个关键点,求对所有的,从关键点出发随机游走,到达的第一个另外的关键点是的概率。
[ 例 2 ] UOJ #200 【CTSC2016】NOIP十合一
ff
""是矩阵乘法
余子式:=除去i行j列的行列式
k阶主子式:选行列(标号一样)拿出来组成的的行列式
代数余子式:
怎么求:高斯消元
个维向量组成的单纯形超空间体积值为:
如三维体积为
矩阵=度数矩阵-邻接矩阵
求的任何一个阶主子式的值都是是生成树的个数。
若有向图,则:
表示i到j的边的相反数,表示i的入度,行列式的表示以为根的外向树数。
表示i到j的边的相反数,表示i的出度,行列式的表示以为根的内向树数。
设表示欧拉路径的数量,表示点的入度(入度和出度要相等), 表示以点为根的外向树的个数。有
带状矩阵即在矩阵A中,所有的非零元素都集中在以主对角线为中心的带状区域中。
带状矩阵高斯消元时间复杂度,为带宽。。但高斯消元时要向右找非零的数。
[ 例 3 ] WC 2011 最⻓路
…
解线性方程用,略
矩阵A的伴随矩阵是A的余子矩阵的转置矩阵,即:
作为拉普拉斯公式的推论,关于的矩阵的行列式有:
…
若存在,积和式,行列式均不为0。(邻接矩阵,相连的为x部标号,不相连的为0)
…
自闭
dlsnb
Day_3 图论
[ 例 1 ] NOI2019 D2T1
…
[ 例 2 ] n个点,m条边DAG,求删去每个点后1->n的最短路。
n,m 3e5
定义表示的最短距离,表示的最短距离。
拓扑序枚举,对于,拓扑序为,答案为
[ 例 3 ] 给n个点m条边的有向图,计算每个点传递闭包大小,最多答案差两倍。(Ans/2 <= ans <= 2Ans)
n,m 2e5
例3 题解 :随机, 拓扑传最小值,,多做几次精度就准了。
[ 例 4 ] SD省队集训D1T1
n点m条无向边,第i条边花费为2^i,要经过每一条边至少一次,且回到原地,求最小花费时间。
最小生成树,贪心调整…
[ 例 5 ] Hihocoder Challenge 28
n,k <= 50,e_w <= 1e9, 求所有生成树权值和的k次方和
把矩阵树定理中的数的空间拓宽到次多项式并且用求逆元的方法消元。
注意如果过大就直接代入插值了。
copy的,不会
[ 例 6 ] 最小方差生成树 N 300 M 1e5 wi 1e18
暴力:枚举权值和(平均值)做MST,时间复杂度
暴力2:本质不同的边排列顺序只有种(只有经过两值中点才会交换顺序),直接枚举然后MST,时间复杂度。
发现当随着平均值枚举增大,是形状相同,顶点在x轴上,开口向上的二次函数,一条边如果被后面的其他边替换掉就再也不会回来。
按区间从小到大来求,在两条边大小关系改变时,考察能否用新的小边替换大边使得还是一棵树,也就是不断调整最小生成树,用维护,由于改变次数 ,所以时间复杂度 ,但常数很大。
暴力3:可以发现一条边出现在最小生成树中一定是一段区间,记作,可以用并查集维护最大生成树求出。求出后,得到个时间点,从小到大扫,在处加入边,在处删除。不用维护树的形态。时间复杂度。
正解:维护树的形态,用维护最大生成树,加入一条边如果不连通,就是,联通就在路径上查询边权最小的边j,让,弹出一条边的时候求出。求出来后用暴力3的方法求答案,时间复杂度
详见《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 字符串
[ 例 1 ] Bzoj 4556 [Tjoi2016&Heoi2016]字符串
给出字符串S,每次给出a,b,c,d,询问S[a,b]的所有子串和S[c,d]的最长公共前缀的最大值。
[ 例 2 ] Bzoj十连测第五场 B 可持久化字符串
[ 例 3 ] Bzoj 4310
[ 例 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)为最长回文公共前缀。
每次在S后添加一个字母c,输出F(|S|)
考虑,就是回文树上最后一个字母代表的节点与其他所有节点的LCA的长度和…
回文树。不会。
[ 例 6 ] 求一个字符串的所有字串中,任选2个(可以相同),计算
N <= 1e5, 串伪随机(其实不伪随机也可以做)
问题也就是询问该串的后缀树上,长度不超过L的…
[ 例 7 ]Deep Purple
多次询问区间LBorder(L:Largest) 1e5
把求border转化为求period…
[ 例 8 ] NOI赛前集训-D6T2
。。。
对于字符串,如果的最⼩后缀是他本身,那么是 串。
为串等价于本身是其循环移位中最小的⼀ 个
存在性
唯一性
…
[ 例 9 ] 2019NOI赛前集训 D6T3
…
[ 例 10 ] Fim4
…
Day_4 ACM
ACM赛
做了4道水题,Freopen巨佬做了5道题 -> 排名6 (最高排名 2)
Day_5 树上数据结构
【例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.问当前最大权值联通块
。。。
【例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,…}的生成函数
【例2】4种球,每种无限个,要选出n个球。n很大,要满足:
红球只能选偶数个
黄球只能选5的倍数个
蓝球最多只能选4个
绿球只能选1或0个
对每一维进行
就是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的倍数的路径会对答案造成的贡献,Len为路径长度。路径可以经过重复的边,答案对P取模。
M <= 10 K <= 1000 P $equiv$1(mod K),N <= 1e18
组合数贡献可以通过加自环去掉,也就是Len时间再走,其他时间走自环/休息,那么每天路径的贡献都是1。这样的话自环不能算作路经长度。
【例6】染色问题 m种颜色 染n个点的环,要求第i种颜色恰好染ci次,求本质不同的方案数。
…生成函数 burnside引理/Polya定理
多项式多点求值
多项式多点插值
【例7】拆分数的nlog做法:生成函数->多项式exp