[补]NOIP2020T4微信步数
[补]NOIP2020T4微信步数
题意:一个人在 \(k\) 维平面上,每一维范围是 \([1,W_i]\) 上的任意一个位置,初始可以在任何一个位置
这个人在空间上游走,每 \(n\) 步为一轮不断重复,每一步是一个方向上走-1或者1,求所有情况下 最后他离开空间范围的时间 之和
分析:
行走是循环的,每一维可以先看做独立,然后离开范围的时间就是每一维取 \(\min\)
一个简单的思路:
求出每一维每一个位置离开的时间,然后 \(k\) 路归并得到答案,复杂度为 \(O((\sum W_i)k+nk)\)
容易想到根据循环来优化计算,但是如果以每一个位置为元素进行考虑,难以处理不同长度循环之间的合并
\[ \ \]
更换思路:
简单的计数方法的转换:
从初始位置离开的时间之和 = 前 \(i(i\ge 0)\) 步还未离开空间的初始位置个数之和
令 \(F_{i,j}\) 为 \(i\) 这一维 \(j\) 步还未离开的初始位置个数,则答案就是 \(\begin{aligned} \sum_{i\ge 0}\prod F_{i,j}\end{aligned}\)
此时观察发现除了第一轮需要特殊考虑以外,其它的 \(F_{i,j}\) 可以表示为 \(\max\lbrace0,F_{i,j-n}-D_i\rbrace\) (其中 \(D_i\) 为每一轮 \(i\) 这一维偏移的量)
对于前面 \(n\) (好像是 \(2n\) )个特殊考虑,后面对于每一个不同的 \(i\mod n\) 可以放在一起考虑,用一个统一的式子表示
然后计算就是类似 \(\begin{aligned} \sum_{i\ge 0}\prod (G_j-i D_j)\end{aligned}\) ,以 \(i\) 为元,所求的就是是一个 \(k\) 次多项式前缀和,也就是一个 \(k+1\) 次多项式的点值
暴力的方法就是 求出前面 \(k+2\) 项的值,然后用 拉格朗日插值/高斯消元 得到答案,复杂度为 \(O(nk^2-nk^3)\) (如果插值写好一点,复杂度主要受限于求值)
~~然后甚至可以无脑吸多项式做到 \(O(nk\log ^2k)\) ~~
求值时可以发现 对于 \(i\) 所求的 \(j\) 处点值的积式里面 最多只有一项和 \(i-1\) 不同,因而可以特殊考虑以优化求值复杂度
下面是 \(nk^2\) ,由于求值已经是 \(k^2\) 了,所以插值也没优化
1 |
|