参考ccf-csp20220302
一条时间线设为数组time[N] (const int N=2e5),每个出行计划可行的时间段上time[i]++,最后想要查询当前时间点q+k能有几个出行计划能行,输出time[q+k]即可。
可以在遍历每个出行计划的时候记录时间段,如图:
或者这个循环同意记录时间段左右起点,另起一个前缀和来完成整段记录,如图:
结果一样,但是运行时间大有不同,双重循环耗时,如图:
前缀和如何理解:
比如:
完整代码解答:
#include<iostream>
using namespace std;
const int N = 2e5;
int main() {
int time[N] = { 0 };
int n, m, k;
cin >> n >> m >> k;
for (int i = 1, t, c, l, r; i <= n; i++) {
cin >> t >> c;
l = max(0, t - (c - 1));
r = max(0, t);
time[l]++;
time[r + 1]--;
}
for (int i = 1; i <= 2e5; i++) {
time[i] = time[i] + time[i - 1];
}
for (int i = 1,q; i <= m; i++) {
cin >> q;
if (q+k > 2e5) cout << 0 << endl;
else
cout << time[q+k] << endl;
}
return 0;
}