题单对应链接:https://www.luogu.com.cn/training/971456
T1
P6475 [NOI Online #2 入门组] 建设城市
我们发现对于 x 和 y 的讨论是容易的,那我们可以考虑如何计算有 k 个数,要求每个数 ≤num 且单调不降的方案数。
我们可以思考后发现,这似乎可以转化为要在 k 个球之间插入 num 个板,允许板与板之间为空的总方案数。
这就很板了,答案就是 (kk+num−1) 剩下的分讨即可。
T2
P10138 [USACO24JAN] Cowmpetency G
我们可以考虑计算 fi,j 表示对于前 i 个数,最大值为 j 的所有合法方案,再用前缀和优化即可做到 O(nclogv)。
我们可以考虑区间离散化,把它按照区间离散成点,这样就可以做到 O(qclogv)。
T3
P2182 翻硬币
似乎这个 DP 不是很难。
为了方便,我们令起始串为 s,终止串为 t。
我们发现,如果说状压来求的话复杂度是指数级别的,那我们需要考虑一个只有 t 有的性质,其他数没有的。
这有个 trick 就是可以考虑状态与目标状态之间的不同,在这里就是考虑当前状态与目标状态之间有多少个点是不同的。
所以,我们可以定义 fi,j 表示在第 i 轮中,我与目标 t 有 j 个位置不同的方案数。
这里,我们可以考虑一种我为人人的解法,只需考虑在原本不同的硬币里面有多少个硬币被翻面了。
转移是好想的:
fi,j+m−k×2=fi,j×(kj)×(m−kn−j)
其中 k 是枚举的原本状态不同的硬币中被翻面的数量,答案就是 fK,0。
T4
AT_arc212_c [ARC212C] ABS Ball
关于一种计数的讨论、ARC212C Solution
T5
CF1842G Tenzing and Random Operations
模拟赛时遇到的 trick,还是挺有意思的。
暴力
首先,可以考虑 O(nm2) 的暴力,可以定义状态为 fi,j 表示对于前 i 个数,使用了 j 次操作。
我们可以考虑一个人人为我的 DP。
我们可以枚举 k 表示当前这个数使用了多少次操作,那转移就很明显了(为何我赛时没调出来):
fi,j+k=fi−1,j×(kk+j)×(ai+val)
其中 val 为 (k+j)×v吗,最后求出 nm 的逆元即可。
正解
我们可以考虑将 ai+x×v 看做有 ai+x×v 条边链接 i 和 i−1,求出方案数。
这一点我们可以发现它最多会产生 n 条新加的边(即 x×v),这引发我们可以重新定义 fi,j。
定义 fi,j 表示当前到了 i 号点,使用了 j 条新加的边,这里我们可以考虑我为人人的 DP。
因为在加入这条边以后就可以无限制的使用,所以可以考虑这条边在哪里出现。
转移如下:
fi+1,j=fi,j×(j×v+ai+1)fi+1,j+1=fi,j×(m−j)×v×(i+1)
答案即是 ∑i=0nfn,i×nm−i,最后处理一下 nm 的逆元即可。