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;
}