1 条题解

  • 0
    @ 2025-8-24 21:14:31

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar Maxmilite
    **

    搬运于2025-08-24 21:14:30,当前版本为作者最后更新于2023-01-05 21:08:49,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    [语言月赛202301] 避雷针 题解

    Source & Knowledge

    2023 年 1 月语言月赛,由洛谷网校入门计划/基础计划提供。

    文字题解

    题目大意

    给定 n,mn, m 和一串序列 a1,,ama _ 1, \cdots, a _ m

    对于第 ii 个元素,其影响了 ai2a _ i - 2(如果存在)、ai1a _ i - 1(如果存在)、aia _ iai+1a _ i + 1(如果存在)、ai+2a _ i + 2(如果存在)这些位置。

    需要计算最后 nn 个位置中有几个位置被影响到。

    解析

    注意到 1n,m1061 \leq n,m \leq 10 ^ 6,所以我们可以直接建立长度为 10610 ^ 6 的数组 ff,并全体初始化为 00

    mm 个元素,如果某一元素影响了 ii 号位置,我们便将 fif _ i 标记为 11

    需要注意的是,题目仅保证 1ain1 \leq a _ i \leq n,因此直接访问 ff 数组的 ai2a _ i - 2 等下标对应的位置可能会导致越界访问。

    这里一个比较取巧的方法是,在遍历 ai2ai+2a _ i - 2 \sim a _ i + 2 时,我们将遍历范围直接使用 maxmin 函数限定到 [1,n][1, n] 内。核心代码如下:

    for (int i = 1, x; i <= m; ++i) {
    	scanf("%d", &x);
    	for (int j = max(1, x - 2); j <= min(n, x + 2); ++j)
    		f[j] = 1;
    }
    

    最后统计 ff 数组中有几个 11 并输出即可。

    视频题解

    完整代码请在视频中查看。

    • 1

    信息

    ID
    8243
    时间
    1000ms
    内存
    512MiB
    难度
    1
    标签
    递交数
    0
    已通过
    0
    上传者