[NOIP2020]微信步数

博客详细介绍了如何解决微信步数问题,从暴力解法到优化策略,包括利用动态规划和多项式运算降低时间复杂度,最后给出了源码实现。
摘要由CSDN通过智能技术生成

微信步数

题解

现在才补一年前的题。

首先我们的考虑一个简单的暴力。然而我考场上连这个暴力都没想到
我们将一个点能走多少步转化一下,通过整体来看。
我们考虑走了这一步后还有多少点能够幸存,即没有走出整个网格。
显然,每一维在幸存的长度上是独立的,如果第 i i i维我们幸存的长度为 l e n i len_{i} leni,那么我们总的幸存的的格子数是 ∏ i = 1 k l e n i \prod_{i=1}^{k}len_{i} i=1kleni。显然所有幸存的所有点是连续的多面体,我们可以把它们乘起来得到总答案。
我们考虑对于这一维,我们幸存的区间是 [ L i , R i ] [L_{i},R_{i}] [Li,Ri],那么我们的移动相当于让我们的区间变成 [ L i + x , R i + x ] [L_{i}+x,R_{i}+x] [Li+x,Ri+x]
如果这次移动后有部分区间超出我们 [ 1 , w i ] [1,w_{i}] [1,wi]的限制了,那么这一部分区间显然是应当被删去的,那么幸存的区间就变成了 [ max ⁡ ( 1 , L i + x ) , min ⁡ ( w i , R i + x ) ] [\max(1,L_{i}+x),\min(w_{i},R_{i}+x)] [max(1,Li+x),min(wi,Ri+x)]
我们新的 l e n i len_{i} leni就成了 min ⁡ ( w i , R i + x ) − max ⁡ ( 1 , L i + x ) + 1 \min(w_{i},R_{i}+x)-\max(1,L_{i}+x)+1 min(wi,Ri+x)max(1,Li+x)+1
这样,我们只需要每次操作更改我们的操作这一维的长度即可。
显然这样暴力的时间复杂度是 O ( n max ⁡ ( w i ) ) O\left(n\max(w_{i})\right) O(nmax(wi))的,大概可以拿 30 p t s 30pts 30pts

但显然上述过程是可以优化的。
我们的第一轮操作由于最开始是没有模板的,所以第一轮的移动是与其它轮移动是没有规律的,我们记在第一轮第 i i i维移动带来的变化后的长度为 a i a_{i} ai
之后每一轮带来的变化都是固定的,我们记其使我们长度的变化为 b i b_{i} bi
显然,之后的第 i + 1 i+1 i+1轮移动后,我们的第 j j j维还剩的长度为 a j − i b j a_{j}-ib_{j} ajibj
我们不如再记录一下第 2 2 2轮之后每一轮的前 i i i步能对我们的第 j j j维产生影响的大小为 f i , j f_{i,j} fi,j
这样,我们就可以知道我们第 i i i轮第 j j j次的大小了。
我们假设总共进行了 T + 2 T+2

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
NOIP 2020 复赛是全国青少信息学奥林匹克竞赛的复赛阶段,是一个以算法设计和编程能力为基础的竞赛。以下是本次复赛的解析。 本次复赛共有三道算法设计题目,分别是: 1. 骨牌方块:给定两个整数 n 和 m,要求计算由 2×1 大小的骨牌方块填满一个 n×m 大小的长方形区域的方法数目。这道题可以用动态规划的思想来解决,具体的过程是利用递推公式将大问题划分为小问题,通过累加小问题的解来得到最终的结果。 2. 双核处理器:给定一个长度为 n 的正整数数,要求将这个数划分为两个非空子集,使得两个子集的和的差最小。这道题可以用动态规划和背包问题的思想来解决,具体的过程是通过动态规划的方式遍历所有可能的子集,然后计算它们的和的差,最终选择差值最小的子集。 3. 牌局:有 N 张牌摆成一排,每张牌上有一个正整数数值,要求你从这 N 张牌中移除若干张牌,使得剩下的牌是递增排列的,并且移除的牌的数值和最大。这道题可以用动态规划的思想来解决,具体的过程是通过维护一个动态规划数来记录到当前位置为止的最大取值,然后根据当前牌的大小来更新该数的值。 以上是对 NOIP 2020 复赛题目的简单解析,通过这次竞赛可以锻炼学生的算法设计和编程能力,提高他们的解决实际问题的能力。希望学生们能够在这次竞赛中获得更多的收获和成长。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值