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'  阅读(112)  评论(0编辑  收藏  举报