CF1387(BOI2020 Day2)
A - Graph
没啥好说的,直接设个未知数然后解个方程。
如果 \(x\) 解不出来,那么就枚举断点。
17分调了好久,以为是精度问题,实际是很 sb 的错误。
静查很重要!
B1 - Village (Minimum)
对于一个菊花答案其实明显就是 2*花瓣。
然后对于一棵树进行菊花剖分,这样每一个菊花都是局部最优解,然后发现菊花间交错肯定不是更优。
如果剩下一个点可以并入任意一个菊花。
严谨一点:下界其实是 2*(n-匹配数),而这个下界可以达到。
B2 - Village (Maximum)
为啥我感觉比 B1 还要简单
直接搞上界就是 \(\sum_{e} min(n-sz_u,sz_u)\) ,重心找到交错分配。
C - Viruses
整理一下数据:\(G\) 表示基因数,\(m\) 表示抗体数, \(\sum k \leq 100\) 表示基因转移个数, \(\sum l \leq 50\) 表示抗体总长,\(G \leq \sum k\)。
考虑 \(m=0\) 的部分分,直接转移跑最短路。
\(m=1\) 时,记三维 \(i,st\),\(ed\) 表示以第 \(i\) 基因为基础繁衍,和那个抗体前缀后缀的最长匹配分别为 \(st,ed\),然后两个基因合并的时候就是把后一个的前缀加入跑 \(KMP\) 不能变成基因串。
当 \(m\) 多的时候很自然就把 \(KMP\) 改成 \(AC\) 自动机,然后对于前缀和后缀各建一棵 \(AC\) 自动机,然后记两维表示在哪个节点,但好像这种方法很烦。。
再换一种 \(dp\) 设法,\(i,st,ed\) 表示原本在 \(AC\) 自动机上在 \(st\) ,现在在 \(ed\),经过的变换是以 \(i\) 为基础的,最短长度。
然后跑 \(SPFA\),每次对于所有转移条件都跑一次,对于一个转移,就是依次添加字符跑 \(Floyd\) 更新。直到所有 \(dp\) 状态跑完一遍没有变为止。
状态数 \(G (\sum l)^2\),设增广次数为 \(T\),则复杂度 \(T\sum k(\sum l)^3\),信仰能过。