2021省选集训总结

博主分享了2021年省选算法竞赛中的题目难点与解题思路,涉及n2dp优化、burnside定理、01trie树、分治与动态规划等算法。详细解析了部分题目,包括复杂度分析和优化方法,如使用AC自动机、网络流、凸优化DP等。
摘要由CSDN通过智能技术生成

2021.3.20省选模拟
t1 推出了一个 n 2 d p n^2dp n2dp,本来想用递推关系之间的系数关系来优化,结果发现求它们的系数关系复杂度极高就放弃了
t2 暴力+k=2
t3 忘记了 b u r n s i d e burnside burnside定理
l = 1 ∣ G ∣ ∑ c ( a i ) l= \frac{1}{|G|}\sum c(a_i) l=G1c(ai)
2021.4.1省选模拟
t1 先将所有 a i a_i ai插入 01 t r i e 01trie 01trie树,设 f [ p ] f[p] f[p] p p p结点及其子树的答案,如果 x x x p p p这位上为 0 0 0,显然 f [ p ] = f [ l s ] ⋅ f [ r s ] f[p]=f[ls]\cdot f[rs] f[p]=f[ls]f[rs],否则在 p p p子树内最多只能选择 2 2 2个数,暴力 d f s dfs dfs下去即可,暴力时间复杂度感觉不太对
t2
c ( l ) c(l) c(l)表示最大长度等于 l l l的方案数,则答案等于 ∑ i = x + 1 n c ( l ) ⋅ ( i − x ) \sum_{i=x+1}^nc(l)\cdot (i-x) i=x+1nc(l)(ix),直接等于很难算,考虑求出小于等于 l l l的,然后差分
f i f_i fi表示满足最后一个元素与最后第二个元素颜色不同,且符合条件的序列的个数,容易得到转移
f i = { k    ( i = 1 ) ( k − 1 ) ∑ j = 1 min ⁡ ( l , i − 1 ) f i − j   ( i ≥ 2 ) f_i=\begin{cases}{} k\ \ (i=1)\\(k-1)\sum_{j=1}^{\min (l,i-1)}f_{i-j}\ (i\ge 2)\end{cases} fi={k  (i=1)(k1)j=1min(l,i1)fij (i2)
注意答案应该为 f [ n + 1 ] / ( k − 1 ) f[n+1]/(k-1) f[n+1]/(k1),因为 f f f设的时候钦定了位置 1 1 1与位置 2 2 2上的数不同
s i = ∑ j = 1 i f i s_i=\sum_{j=1}^i f_i si=j=1ifi,则
s i − s i − 1 = ( k − 1 ) ⋅ ( s i − 1 − s i − l − 1 ) s_i-s_{i-1}=(k-1)\cdot(s_{i-1}-s_{i-l-1}) sisi1=(k1)(si1sil1)
s i = k ⋅ s i − 1 − ( k − 1 ) ⋅ s i − l − 1 s_i=k\cdot s_{i-1}-(k-1)\cdot s_{i-l-1} si=ksi1(k1)sil1
问题可以转化成一些点,第 i i i个点到第 i + 1 i+1 i+1个点有 k k k种方案,第 i i i个点到第 i + l + 1 i+l+1 i+l+1个点有 k k k种方案,求到第 n n n个点的方案数,枚举走多少次路径 2 2 2,组合数求解,时间复杂度 O ( n i ) O(\frac{n}{i}) O(in)
总时间复杂度 O ( ∑ n i ) = O ( n log ⁡ n ) O(\sum\frac{n}{i})=O(n\log n) O(in)=O(nlogn)
t3 还不太会,算法是凸优化 d p dp dp+整体二分

2021.4.2省选模拟
t1 码农题,疯狂对拍跳了一个下午+一个晚上,建虚树,对于虚树上每个点,找到它跟它父亲之间路径的分界点,然后倍增求答案,对于答案在结点上的情况,先把每个结点的儿子按照子树最深的点的深度排序,然后从大到小查,最多查 k k k个,因为懒就没有写,所以就tle了5分
t2 极其潦草的题面,还不会
u p d a t e   o n   2021.4.6 update\ on\ 2021.4.6 update on 2021.4.6
f ( n ) = ∑ i = 1 n ∑ j = 1 n μ ( i ) ⋅ μ ( j ) ⋅ [ gcd ⁡ ( i , j ) = 1 ] f(n)=\sum_{i=1}^n\sum_{j=1}^n\mu(i)\cdot \mu(j)\cdot [\gcd(i,j)=1] f(n)=i=1nj=1nμ(i)μ(j)[gcd(i,j)=1]
= ∑ i = 1 n μ ( i ) ∑ j = 1 n μ ( j ) ∑ d ∣ i , d ∣ j μ ( d )     =\sum_{i=1}^n\mu(i)\sum_{j=1}^n\mu(j)\sum_{d|i,d|j}\mu(d)\ \ \ =i=1nμ(i)j=1nμ(j)di,djμ(d)   
= ∑ d = 1 n μ ( d ) ∑ d ∣ i n μ ( i ) ∑ d ∣ j n μ ( j )      =\sum_{d=1}^n\mu(d)\sum_{d|i}^n\mu(i)\sum_{d|j}^n\mu(j)\ \ \ \ =d=1nμ(d)dinμ(i)djnμ(j)    
= ∑ d = 1 n μ ( d ) ( ∑ d ∣ i n μ ( i ) ) 2                =\sum_{d=1}^n\mu(d)(\sum_{d|i}^n\mu(i))^2\ \ \ \ \ \ \ \ \ \ \ \ \ \ =d=1nμ(d)(dinμ(i))2              
考虑到要求出 f ( i ) , i ∈ [ 1 , m ] f(i),i\in[1,m] f(i),i[1,m],若已求出 f ( i − 1 ) f(i-1) f(i1),那么到 f ( i ) f(i) f(i)只会改变 i i i的约数个 ∑ d ∣ i n μ ( i ) \sum_{d|i}^n\mu(i) dinμ(i),枚举约数,增量求解,复杂度调和级数,枚举约数应记 p [ i ] p[i] p[i]表示 i i i的最小约数,深搜枚举
g ( n ) = ∑ i = 1 n i ∑ j = 1 n j ⋅ [ gcd ⁡ ( i , j ) = 1 ] g(n)=\sum_{i=1}^ni\sum_{j=1}^nj\cdot [\gcd(i,j)=1] g(n)=i=1nij=1nj[gcd(i,j)=1]
考虑到当 i = j i=j i=j时,只有 i = j = 1 i=j=1 i=j=1时才会有 1 1 1的贡献, i i i j j j又是同级的
= 2 ∑ i = 2 n i ∑ j = 1 i j ⋅ [ gcd ⁡ ( i , j ) = 1 ] + 1 =2\sum_{i=2}^ni\sum_{j=1}^ij\cdot [\gcd(i,j)=1]+1 =2i=2nij=1ij[gcd(i,j)=1]+1
由于互质的对称性
= 2 ∑ i = 2 n i φ ( i ) ⋅ i 2 + 1 =2\sum_{i=2}^ni\frac{\varphi(i)\cdot i}{2}+1 =2i=2ni2φ(i)i+1
= ∑ i = 2 n i 2 φ ( i ) + 1 =\sum_{i=2}^ni^2\varphi(i)+1 =i=2ni2φ(i)+1
= ∑ i = 1 n i 2 φ ( i ) =\sum_{i=1}^ni^2\varphi(i) =i=1ni2φ(i)
F ( S ) = ∑ T ∈ S f ( gcd ⁡ ( a ∈ T ) ) ∏ a ∈ T g ( a ) F(S)=\sum_{T\in S}f(\gcd(a\in T))\prod_{a\in T}g(a) F(S)=TSf(gcd(aT))aTg(a)
= ∑ d = 1 m f ( d ) ∑ T ∈ S [ d = gcd ⁡ ( a ∈ T ) ] ∏ a ∈ T g ( a ) =\sum_{d=1}^mf(d)\sum_{T\in S}[d=\gcd(a\in T)]\prod_{a\in T}g(a) =d=1mf(d)TS[d=gcd(aT)]aTg(a)
后面的式子变得比较难化简,但如果 [ d = gcd ⁡ ( a ∈ T ) ] [d=\gcd(a\in T)] [d=gcd(aT)]变成 [ d ∣ gcd ⁡ ( a ∈ T ) ] [d|\gcd(a\in T)] [dgcd(aT)],后面的式子便可根据组合意义变成 ∑ T ∈ S [ d ∣ gcd ⁡ ( a ∈ T ) ] ∏ a ∈ T g ( a ) = ∏ d ∣ a , a ∈ S ( g ( a ) + 1 ) \sum_{T\in S}[d|\gcd(a\in T)]\prod_{a\in T}g(a)=\prod_{d|a,a\in S}(g(a)+1) TS[dgcd(aT)]aTg(a)=da,aS(g(a)+1)
考虑构造函数 f ( n ) = ∑ d ∣ n h ( d ) f(n)=\sum_{d|n}h(d) f(n)=dnh(d)
= ∑ d = 1 m h ( d ) ∑ T ∈ S [ d ∣ gcd ⁡ ( a ∈ T ) ] ∏ a ∈ T g ( a ) =\sum_{d=1}^mh(d)\sum_{T\in S}[d|\gcd(a\in T)]\prod_{a\in T}g(a) =d=1mh(d)TS[dgcd(aT)]aTg(a)
= ∑ d = 1 m h ( d ) ∏ d ∣ a , a ∈ S ( g ( a ) + 1 ) =\sum_{d=1}^mh(d)\prod_{d|a,a\in S}(g(a)+1) =d=1mh(d)da,aS(g(a)+1)
同样增量求解,时间复杂度为调和级数
t3 还不会

2021.4.3省选模拟
t1 奇怪的 d p dp dp
t2 考虑分块,块内修改时,记录一下图中哪个点被走过,如果一个点走到一个已经被走过的点,那么这个点一定不可能是最小的,散块修改时,如果这个点曾经被删除过,用长链剖分 k k k级祖先算法 O ( 1 ) O(1) O(1)还原其位置,判断是否加入回集合内,每个块最多走遍整个图,综合来看,时间复杂度为 O ( n n ) O(n\sqrt{n}) O(nn )
t3 奇怪的概率题

2021.4.5省选模拟
t1 又把 A C AC AC自动机复习了一遍,总算把 A C AC AC自动机真正的理解了,理解了一些 f a i l fail fail树的性质
先对所有字符串建出 A C AC AC自动机,设 f i f_i fi表示以 i i i为尾结点的串最大值,考虑更新一个字符串 s s s,将根到该串尾结点的所有结点的 f f f取最值,最后加上 v a l val val,最后将 f a i l fail fail树的子树的 f f f m a x max max
t2 这种奇怪的限制基本上就是网络流了,若无限制,建立超级源点 s s s和超级汇点 t t t,对每个函数都建一堆点, x − 1 x-1 x1对应的点像 x x x对应的点连一条大小为 − f ( x ) -f(x) f(x)的边, s s s向函数开头代表的点连一条大小为 i n f inf inf的边,函数结尾代表的点向 t t t连一条大小为 i n f inf inf的边,最小割大小显然就是答案。若有限制 x u ≤ x v + D x_u\le x_v+D xuxv+D x u − D ≤ x v x_u-D\le x_v xuDxv u u u函数的每一个 x x x都向 v v v函数中的 x + D x+D x+D连一条边,无解随便怎么判都行
t3 神仙题,好像要用线性基+LCT

2021.4.7
t1 神仙 d p dp dp,斜着太丑,直接将图形往右推,这样操作就变成了横着染色,或者竖着染色,设 f i , j f_{i,j} fi,j表示第 i i i行,第 j j j列的格子为白色,并且该格子到该行最后一个格子全部染黑的方案数,答案显然为 ∑ i = 1 ∑ j = 1 f i , j + 1 \sum_{i=1}\sum_{j=1}f_{i,j}+1 i=1j=1fi,j+1
考虑如何转移,分两种情况,第一种,从第 j j j列的状态转移过来,即 f k , j , k < i f_{k,j},k<i fk,j,k<i都能直接转移到 f i , j f_{i,j} fi,j,第二种,从 f k , h , k < i f_{k,h},k<i fk,h,k<i转移到下,由于 j j j列之后都会染黑,所以 h ≤ j h\le j hj,又因 h = k h=k h=k已经讨论,所以 h < k h<k h<k,由于 h h h之后也会染黑,所以 k k k所代表的行的结尾必须在 j j j前面,结尾到 ( i , j ) (i,j) (i,j)之间的格子都可以随便填,乘上 2 d i s 2^{dis} 2dis次方就行了, d i s dis dis表示结尾到 ( i , j ) (i,j) (i,j)之间的距离,时间复杂度为 O ( n 3 ) O(n^3) O(n3),好像再优化一下就变成 n 2 n^2 n2,只是我太菜,听不懂

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值