CSP 202203-2 出行计划

举报
辰chen 发表于 2022/06/15 00:52:58 2022/06/15
【摘要】 文章目录 题解C++ 本题链接:CSP 202203-2 出行计划 本博客给出本题截图: 题解 典型一道 前缀和 + 差分,核算证明的有效时间为: ...

文章目录


本题链接CSP 202203-2 出行计划

本博客给出本题截图

在这里插入图片描述

题解

典型一道 前缀和 + 差分,核算证明的有效时间为: [ q + k , q + k + c − 1 ] [q+k,q+k+c-1] [q+k,q+k+c1],对于每一个 t t t,我们都需要去查看它是否落在了 [ q + k , q + k + c − 1 ] [q+k,q+k+c-1] [q+k,q+k+c1] 上,题目所求的就是有多少个 t t t 满足: q + k ≤ t ≤ q + k + c − 1 q+k≤t≤q+k+c-1 q+ktq+k+c1,化简有: t − k − c + 1 ≤ q ≤ t − k t-k-c+1≤q≤t-k tkc+1qtk,即我们都去统计有有多少个 [ t − k − c + 1 , t − k ] [t-k-c+1,t-k] [tkc+1,tk] 包含点 q q q,因此可以想成一个区间覆盖的问题:
在这里插入图片描述
比如上图中, q q q 就落在了三个区间中,故输出 3 3 3,为此考虑到【前缀和、差分】,关于这两个算法的思想和解释见博客:前缀和差分

再次强调,这两个算法可以说是第二题的必考算法,读者请务必掌握

C++

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 200010;

int s[N];

int main()
{
    int n, m, k;
    cin >> n >> m >> k;
    // 差分
    for (int i = 1; i <= n; i ++ )
    {
        int t, c;
        cin >> t >> c;
        // 差分和前缀和数组要从 1 开始,否则无意义
        s[max(1, t - k - c + 1)] ++, s[max(1, t - k + 1)] --;
    }
    // 注意这里在计算前缀和的时候,for 循环时循环到 N 而不是 n
    for (int i = 1; i <= N; i ++ ) s[i] += s[i - 1];

    for (int i = 1; i <= m; i ++ )
    {
        int q;
        cin >> q;
        cout << s[q] << endl;
    }

    return 0;
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

文章来源: chen-ac.blog.csdn.net,作者:辰chen,版权归原作者所有,如需转载,请联系作者。

原文链接:chen-ac.blog.csdn.net/article/details/123927375

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。