2022.06.29 NOI模拟赛总结
1. 时间安排
7:30~8:00 看题面
T1:数据范围允许直接暴力预处理两两lcp,但是接下来是一个区间二分图最大匹配问题,感觉复杂度降不下来,只能暴力做。
T2:计数题,998244353已经预示这是个多项式题,可以试试 \(n^3\) dp。
T3:树上DP,爆搜估计是搜不动的,试着写一写状压dp。
8:00~9:00
不想写费用流,暴力直接打了个状压dp,答案没问题。
想了很久满二分图有什么性质或者怎么压下来二分图的边数,没有结果。
9:00~10:00
打了个状压dp,答案没问题。
先试着把图拆成一部分有k个树一部分没有树,用之前的dp值去更新,乘上组合数系数,再二项式反演回去,但是答案错了。
查了很久是哪里的问题,找不到,先写T3。
10:00~11:00
实在想不到怎么dp,打了个爆搜,果然极限数据跑不动,只能老老实实dp。
想了一会发现点与点间的状态转移不受时间的影响,至于持续时间为0的可以直接视为点权伴随转移。
打完没问题,复杂度是 \(O(n^2(t+q))\)。
想了很久怎么降单次dp的复杂度,想不出来。
11:00~12:00
打了个T1的费用流骗分,然后继续查T2,一直到结束也没结果。
result:
T1: 20 T2: 20 T3: 0(细节写挂了)
2.总结
T1:
没想到居然是贪心……在二分图匹配上里正解越走越远。
可以暴力建出来反串的trie树,每次查询的时候暴力遍历trie树,这个点被当做lcp的次数即为l1-r1中结束位置在当前点的子树内的串的个数和l2-r2之间的个数取min,暴力统计即可。
正解是四维莫队,同时维护4个指针确定两个区间,把取min操作拆开,先处理l1-r1间正常加减,再处理l2-r2反过来加减即可维护出来两个值的差的绝对值,总字符数减去后就是答案的2倍。
T2:
%60分的Poly神J和DP神L。
没太懂L神的 \(O(n^2k)\) 做法,感觉很麻烦,J神的 \(O(n^2(logn+k))\) 多项式做法思路比较易懂。
首先自己犯了个很严重的错误:二项式反演是从钦定推到只有,也就是说求的方案应该是钦定K个树剩下随意,而不是钦定K个树剩下不能有树。
而且应该限制钦定的K个树必须是一个森林,并不是自认为的之前求出来的答案。
然后可以求出来 \(f_{i, j}=\sum_{k=1}^{i}f_{i-k, j-1}*C^k_n*k^{(k-2)}\)
(注意:n个点的图生成树个数为 \(n^{(n-2)}\) (可以用prufer序列证明))
然后可以推钦定:
\(g_{i, j}=\sum_{k=0}^{i}f_{k, j}*C^k_i*2^{C^2_{i-k}}\)
最后二项式反演即可。
三者都可以用ntt加速,需要注意的是二项式反演的卷积形式是个减法卷积,需要特殊处理。
形如 \(f_i=\sum_{j=i}^{n}g_j*h_{j-i}\),把g先翻转,做加法卷积后,把f翻转即可得到答案,证明可以用生成函数
正解是很麻烦的生成函数。
首先考虑一个式子:\(n^m=\sum_{i=0}^{m}n^{\underline i}S_{m, i}\)(S为斯特林数,可以用斯特林数组合意义证明)
题目要求 \(\sum (f(G))^k\)(G为图的形态),可以转化为求 \((f(G))^{\underline k}\) 再用上式合并。
这个式子相当于求在所有树中选出来k棵的方案数。
所以答案就是 \(T^k(x)G(x)\),其中 \(T(x)=\sum_{i>=1}\frac{i^{i-2}}{i!}x^i, G(x)=\sum_{i>=0}\frac{2^{C^2_i}}{i!}x^i\)。
K只有20,暴力做k遍即可。
复杂度:\(O(nk^2+nklogn)\)(J神说可以做到严格\(O(nklogn)\)%%%)
T3:
10分的代码去掉一个循环就是30分,不过思维难度可不只一个循环。
既然做一遍DP的复杂度不好降,与其钻研怎么降,不如想怎么能只用一遍DP求答案。
这种对n个点都求一遍的降DP次数套路以前只会往换根上面想,今天L神教会了我逆向思维的思路。
思考n遍DP的必要性在于固定了起点,其他点不能作为起点出发。
但是容易发现终点是不固定的,每个点都可以成为备选的终点,并且终点态唯一,不可以进行下一步的转移,换句话说终点态是已知的。
类似概率期望DP的思路,正着不好做,但终点态已知,就倒着做。
本题同样,考虑从T时刻出发,一步步倒推回0时刻,最终每个点0时刻的dp值就是该点作为起点的答案,正确性显然。
这种正难则反的思维很重要,今天又见到一种套路。
正解是很麻烦的点分树,还没懂。
(待upd)
others:
1 . 常用图相关生成函数
n个点的树:\(F(x)=\sum_{i>=1}\frac{i^{i-2}}{i!}x^i\)
n个点的图:\(F(x)=\sum_{i>=0}\frac{2^{C^2_i}}{i!}x^i\)
n个点的连通图:\(F(x)=ln\sum_{i>=0}\frac{2^{C^2_i}}{i!}x^i\)
2 . 复合函数求导(感谢J神)
\((f(g(x)))'=\frac{df(g(x))}{dx}=\frac{df(g(x))}{dg(x)}*\frac{dg(x)}{dx}=f'(g(x))g'(x)\)(也提醒了\((f(g(x)))'!=f'(g(x))\))

浙公网安备 33010602011771号