省选模拟15 题解
A. 倒计时
考虑50%的部分分。
分块来削这个数。
后四位形成一块,预处理出9991~9999在前五位的最大值为0~9情况下分别会削到的值和削的次数。
对于零散的后四位暴力削,这样就可以通过根号预处理,根号削$n$了。
容易发现,对于$n$比较大,我们多分几次块,每次用较小一级的块来预处理大块就行了。
B. 旅行路线
容易发现问题可以转化为一棵1为根的树,统计每个点到树上祖先的本质不同子串。
将点到祖先转化为祖先到子孙,于是问题是一个简单的广义后缀自动机。
C. 流浪者
最终只关注路径上经过的障碍点个数。
容易发现这个向下取整在不断进行的情况下最多有$log2(s)$种取值。
对于障碍点个数很多(>$log2(s)$),最终的$s$为1。
对于50%可以直接在原网格图上dp。
$dp_{i,j,k}$表示 到$i$行$j$列 已经经过了$k$个障碍点。
特别的$dp_{i,j,25}$(这里我认为25已经大于$log2(s)$)表示到$i$行$j$列 已经经过了不小于$25$个障碍点的方案数。
对于比较大的数据 在原图上dp不可行
但是k比较小,所以将k个障碍点抽离出来
为了方便 如果不存在障碍点(1,1)和障碍点(n,m),加入这两个点
然后考虑从一个障碍点到另一个在它右下角的障碍点的方案数,是一个组合数。
问题在于暴力进行这个dp过程,算得的结果是不准确的。
因为两个障碍点之间可能存在着其他的障碍点,一个方案实际上经过了中间的障碍点但没有统计到。
可以把这样的情况容斥掉。
一个自然的想法是令$dp_{i,j}$表示到第$i$个障碍点,已经经过了至少$j$个障碍点的方案数。
最终得到了$dp_{k}$数组,对这个数组进行二项式反演即可。
但是容易发现,如果使用这种容斥方式。
$dp_{k,i}$需要通过所有$dp_{k,j}(j>i)$来进行容斥,同时对于每个$j$的转移系数是不同的。
这也就导致了无法通过原来的特殊性质(即只考虑比较少个数的障碍点)来进行dp了。
一个解决办法是将最终的容斥提前,改为对每个$dp_{i}$数组进行容斥,使$dp_{i,j}$表示恰好经过$j$个障碍点。
考虑一个非法的方案,一定可以表示为$11111100$,其中一个数字$1$表示经过了一个障碍点并统计到了,$0$则表示经过了但没统计到。
这样的话实际上还对应着一种方案为$11111110$,这样考虑的话使$dp_{i,j}$减去$dp_{i,j+1}$就可以了。
$dp$数组中不统计超过$log2(s)$的方案,最终通过每个点的$dp_{i,log2(s)}$乘组合数即可,实际上直接用总方案数减也可以得到。
D. 摆棋子
因为一些特殊的原因,出现了$D$题。
因为一些特殊的原因,这场考试成为了唯一一场赛时超过300分的考试。
然而这是一道原题 土兵占领。
通过将摆棋子转化为删棋子,实现跑最大流而得到最小的答案。