CCF 202203-2 出行计划(C++)差分性质

差分性质:要给数组 Q 的第 a 个到 第 b 个数(从1开始的数组)加 k,那就 Q[a]+=k, Q[b+1]-=k。
最后再将 Q 求前缀和还原数组 : 遍历 Q[i] = Q[i] + Q[i-1]

#include<iostream>
#include<bits/stdc++.h>

int Q[200005];
int n, m, k;

using namespace std;

int main()
{
    scanf("%d %d %d", &n, &m, &k);
    for (int i = 0; i < n; i++){
        int t, c;
        scanf("%d %d", &t, &c);

        int l = max(t-k-c+1, 0);
        l = min(l, 200000);
        int r = max(0, t-k);
        r = min(r, 200000);

        //在【l,r】时间段内能出行的计划个数加一
        Q[l] += 1;
        Q[r+1] -= 1;
    }

    //利用差分计算每个时间能出行的个数
    for (int i = 1; i < 200001; i++){
        Q[i] += Q[i-1];
    }

    for (int i = 0; i < m; i++){
        int q;
        scanf("%d", &q);
        printf("%d\n", Q[q]);
    }

    return 0;
}

posted @ 2022-08-12 16:34  白缺  阅读(224)  评论(0)    收藏  举报