CSP 202203-2 出行计划

本文详细解析了一道CSP比赛中的出行计划问题,该问题可以通过前缀和与差分技巧来解决。文章介绍了如何利用这两种算法进行区间覆盖的统计,并给出了C++实现代码,强调了这两个算法在解决此类问题中的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章目录


本题链接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;
}

根据提供的引用内容,我无法确定您具体想了解什么关于CSP出行计划Java方面的内容。但是,我可以为您提供一些关于CSP出行计划和Java的基本信息。 CSP出行计划是一个基于云计算的智能交通出行服务平台,它可以为用户提供出行规划、路线推荐、实时路况、公交查询等服务。而Java是一种广泛使用的编程语言,它可以用于开发各种类型的应用程序,包括Web应用程序、桌面应用程序、移动应用程序等。 如果您想了解如何使用Java开发CSP出行计划相关的应用程序,您可以参考以下步骤: 1.了解CSP出行计划的API接口文档,确定需要使用哪些API接口。 2.使用Java编写代码,调用CSP出行计划的API接口,获取所需的数据。 3.根据获取的数据,进行相应的处理和展示,以实现所需的功能。 下面是一个使用Java调用CSP出行计划API接口获取公交查询结果的示例代码: ```java import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLEncoder; public class BusQuery { public static void main(String[] args) { String appkey = "your_appkey";//你的appkey String city = "北京";//城市名 String bus = "特8";//公交线路名 String url = "http://api.csp.cn/bus/line?appkey=" + appkey + "&city=" + URLEncoder.encode(city) + "&bus=" + URLEncoder.encode(bus); String result = ""; try { URL realUrl = new URL(url); HttpURLConnection conn = (HttpURLConnection) realUrl.openConnection(); conn.setRequestMethod("GET"); conn.connect(); BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8")); String line; while ((line = in.readLine()) != null) { result += line; } in.close(); } catch (Exception e) { e.printStackTrace(); } System.out.println(result); } } ```
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

辰chen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值