CCF-CSP 202203-2出行计划 差分前缀和

文章讨论了两种不同的C++代码实现,一种导致超时,另一种是通过使用差分和前缀和优化后的AC(Accepted)代码。主要解决的是在给定时间t和区间k的情况下,查询满足特定条件的区间数量的问题。优化后的代码利用了数据结构和算法,如区间累加和左右段抵消,提高了效率。
摘要由CSDN通过智能技术生成

超时代码:

#include <bits/stdc++.h>
using namespace std;
int n, m, k, Index[100005];
struct Plan{
    int t, c;
}p[100005];
int main(int argc, char** argv) {
    scanf("%d %d %d", &n, &m, &k);
    int j = 0, q;
    for(int i = 0; i < n; ++i){
        scanf("%d %d", &p[i].t, &p[i].c);
        int cur = p[i].t;
        while(j<=cur) Index[j++] = i;  //有序,向后映射最近避免有重复
    }
    for(int i = 0; i < m; ++i){  //有序但不能保证紧接着
        scanf("%d", &q);
        int start = q + k, cnt = 0;
        for(int j = Index[start]; j < n; ++j){
            if(p[j].t - start > p[j].c - 1) continue;  //防止后面有更宽松的要求
            else ++cnt;
        }
        printf("%d\n", cnt);
    }
    return 0;
}

AC代码:

已知t,查询q,则区间:q+k<=t<=q+k+c-1 --> t-k-c+1<=q<=t-k

利用差分与前缀和,区间累加影响,左右段抵消

#include <bits/stdc++.h>
using namespace std;

/* run this program using the console pauser or add your own getch, system("pause") or input loop */
const int N = 200005;
int n, m, k, s[N], t, c;
int main(int argc, char** argv) {
    scanf("%d %d %d", &n, &m, &k);
    for(int i = 0; i < n; ++i){
        scanf("%d %d", &t, &c);
        ++s[max(1, t-k-c+1)];  //左边界从1开始, s[0]动态规划起点
        --s[max(1, t-k+1)];  //消除区域后影响
    }
    for(int i = 1; i <= N; ++i) s[i] += s[i-1];  //前缀和累加影响
    int q;
    for(int i = 0; i < m; ++i){
        scanf("%d", &q);
        printf("%d\n", s[q]);
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值