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\),信仰能过。

posted @ 2021-10-27 16:43  'Clovers'  阅读(161)  评论(0)    收藏  举报