省选模拟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分的考试。

然而这是一道原题 土兵占领

通过将摆棋子转化为删棋子,实现跑最大流而得到最小的答案。

posted @ 2020-02-02 21:28  skyh  阅读(126)  评论(0编辑  收藏  举报