首页 > 其他分享 >P7116 [NOIP2020] 微信步数

P7116 [NOIP2020] 微信步数

时间:2023-08-03 20:57:10浏览次数:59  
标签:信步 premin times leq 坐标 premax P7116 NOIP2020 我们

原题

简化题意:
有一个 k 维场地,第 i 维宽为 wi,即第 i 维的合法坐标为 1, 2, · · · ,wi。
小 C 有一个长为 n 的行动序列,第 i 元素为二元组 (ci, di),表示这次行动小 C 的坐标由 (x1, x2, . . . , xci, . . . , xk) 变为(x1, x2, . . . , xci + di, . . . , xk)。小 C 会将行动序列重复无限次,直到走出这个场地。
接下来,小 C 会以场地中的每个整点为起点,按照行动序列走直到走出场地。小 C 想知道他一共会走几步。
答案对1e9 + 7取模
\(n <= 5e5, k <= 10, wi <= 1e9, di \in {-1,1}\)

首先因为每一位是独立的,我们不妨把k维拆开

我们可以发现如果枚举每个位置并模拟走路过程复杂度必然爆炸,故此我们考虑改变记录答案的方式

我们考虑对于每个移动次数\(i\)多有少个起点走\(i\)步还没有走出去,如果没有会产生+1的贡献

我们不妨设\(i=k \times n + j\),我们只需要考虑j不同即可,因为在\(i\mod n\)的情况下每个数只有初始位置是不同的

定义\(s_d\)表示走了一个周期(即走了一个循环)后这一维的变化量,\(premax_{i,d}\)表示\(d\)这一维走前\(i\)步时的前缀最小位移,\(premin_{i,d}\)表示\(d\)这一维走前\(i\)时的前缀最大位移

对于从\(x_d\)开始走了\(k\)个完整周期又走了\(i\)步的第\(d\)维,要满足以下条件:

  • 当\(s_d > 0\),我们可以发现走了\(i\)步后依然没有走出去的条件要求:

    1. \(x_d + premin_{n,d} \geq 1\),意思是这个点的坐标在第一周期任何一步都>= 1,而又因为\(s_d>0\),所以在任意时间都>=1
    2. \(x_d + s_d \times k + premax_{i,d} \leq w_i\),意思是这个点的坐标在最后一个周期后走的\(i\)步内\(\leq w_i\)
    3. \(x_d + s_d \times (k-1) + premax_{n,d} \leq w_i\),意思是这个点坐标在最后一个周期走完后位置\(\leq w_i\),而又因为\(s_d>0\),所以在任意时间都\(\leq w_i\)
    • 合并后即为\(1 - premax_{n,d} \leq x_d \leq w_i - s_d \times k - \max(premax_{i,d},premax_{n,d}-s_d)\)
  • 当\(s_d < 0\)时,相同的,可以得到:\(1 - s_d \times k - \min(premin_{i,d}, premin_{n,d} - s_d) \leq x_d \leq w_i - premax_{n,d}\)

  • 对于\(s_d = 0\),可以得到:\(1 - premin_{n,d} \leq x_d \leq w_i - premax_{n,d}\)

我们可以发现我们在计算时已经枚举了\(i\), \(d\),所以在这个柿子中只有\(k\)为未知数

而且可以发现,k越大这个范围的区间肯定越小。因此对于每一维,我们可以通过二分的方法算出\(k\)最大的取值\(lim_d\)。但我们肯定不能直接暴力,不然复杂度会直接爆炸。这里怎么处理到后面再说

对于每一个\(k \in [0, lim_d]\),对答案的贡献即为\(\prod_d{(r_d-l_d+1)}\),其中\(l_d,r_d\)表示\(d\)这维的\(x_d\)能取到的起点上下界。

根据前面的推到,\(r_d - l_d + 1\)是一个关于\(k\)的一次函数,而若干个一次函数乘在一起,就形成了关于\(k\)的一个多项式,我们记作\(f(x) = \prod_d{(r_d-l_d+1)}\),因此答案\(= \sum \limits_{i=1}^{\min\{lim_d\}} {f(i)}\),然后使用插值计算即可。

复杂度\(O(nk)\)

标签:信步,premin,times,leq,坐标,premax,P7116,NOIP2020,我们
From: https://www.cnblogs.com/fox-konata/p/17604391.html

相关文章

  • NOIP2020游记
    (把很久之前博客漏掉的一篇搬上来了,以此勉励自己每次考试测一遍极限数据,观察大样例)看到这篇游记,您会发现2/3年前的zbs是多么naive啊!时间2020年12月5日下午以下正文:这是我到初二为止获得的第四个二等奖了,离一等,就差把乘/除号换个位置的距离啊!Day-1周五像往常一样回家,瞬间躺......
  • [NOIP2020] 移球游戏 解题报告
    题目描述给定\(n+1\)个栈,栈的高度限制为\(m\)。初始时前\(n\)个上每个有\(m\)个球,最后一个为空。球分为\(n\)种颜色,每种恰好\(m\)个。一次操作可以把一个栈顶的元素弹出放到一个另一个栈顶,但是不可以使栈溢出或下溢。现要把同种颜色的球移动到同一个栈上,你需要构造一......
  • NOIP2020 T2 字符串匹配【题解】
    NOIP2020T2字符串匹配首先声明这篇题解存在大多数让我这种人看懂的废话,如果想要速通,请另寻他解题目简化定义字符串乘法为\(AB\)为把两个字符串拼起来,定义阶乘\(A^i\)表示\(\prod_{1}^iA\)再定义\(F(S)\)为\(S\)中出现奇数次字符的数量现给定一个字符串\(S\),求......
  • P7114 [NOIP2020] 字符串匹配 解题报告
    ~~NOIP的蓝题果然还是好难啊啊啊啊~~前言:作为一道NOIP的真题,这道题放在T2难度并不是特别大,不过考点还是比较偏的,扩展KMP和树状数组的组合,并且还带有一定的思维难度,......
  • P7115 [NOIP2020] 移球游戏
    \(\mathcalLink\)很有意思的题目,并没有想象的那么难。首先,为了方便起见,我们可以认为只有两种颜色的球,记为\(0/1\)。考虑如何将\(0/1\)分开,之后多次重复这一过程,每次......
  • (2022最新版)记录一下微信步数支付宝步数一件拉满教程
    本工具支持微信、支付宝、QQ,按照下面的图文教程,一步一步来,非常简单,几分钟搞定~第一步:下载zepp1、在手机的应用商店搜索下载App:zepp(这边已zepp为例子,下载Zepp......
  • P7115 [NOIP2020] 移球游戏 思路简记
    好题先手玩一下\(n=2\)(只有颜色\(0/1\))的情况:我们假设柱子\(1\)上有\(s\)个\(1\),那就先把柱子\(2\)顶端的\(s\)个球移到\(3\),变成这样:然后把柱子\(1......