模拟29 题解
A. 壕游戏
不会做,以为是贪心。
结果发现贪心是错的。
正解是网络流中的费用流。
将每条边$i$拆为$c_i$条边,
将所有边建出来,每条边的费用为$a_i*j+b_i$,$1<=j<=c_i$。
然后可以直接跑费用流。然而复杂度$O(mk^2)=O(跑不过)$,死了。
考虑优化一下。
考虑到实际上并不需要这么多边,因为起点的流量最多为1,
且在网络流中,每个点在一条增广路中只会出现一次。
每一条边直接被拆为$c_i$条边是没有意义的。
只在边$i$的第$j$个副本被需要的时候,也就是前面的$j-1$个副本都被使用完的时候,新建这条边。
每条增广路上最多有n个点,也就是最多拓展n条边。
总复杂度$O(\sum \limits_{i=1}^{k}K*(m+i*n))=O(K(mk+nk^2))$,
K为spfa的常数。
加上网络流的玄学复杂度,它变为了$O(跑得过)$。
B. 密码
当只有一个匹配串,就是简单的数位dp。
对于多个匹配串该怎么处理?
考虑字符串匹配,对于同一模式串,多匹配串的处理方式。
AC自动机。
然后就完了。
设$dp(i,j,v)$表示到计算到第i位,符合当前匹配状态的AC自动机上节点编号为j,已经匹配到了v个密钥。
当v大于k时,直接设为k。
照例计算r的方案减去l的方案。
C. 大新闻
区间K大。
第一眼是数状数组套权值线段树。
看了一会发现维护的是一个栈,只在边界修改。
主席树裸题。