#include<stdio.h>
#include<iostream>
using namespace std;
const int N = 100005;
int main() {
int time[N] = { 0 };
int request[N] = { 0 };
int n, m, k;
cin >> n >> m >> k;
int q=0;
int temp=0,count=0;
for (int i = 0; i < n; i++) {
cin >> time[i] >> request[i];
}
while (m--) {
cin >> q;
temp = q + k;//出报告的时间
count = 0;
for (int i = 0; i < n; i++) {
if (time[i] >= temp) {//查询任务已经出报告
if ( time[i]-temp+1<= request[i])
count++;//报告在有效期内
}
}
cout << count << endl;
}
return 0;
}
运行时间超时只有70分
爆掉了
满分答案是选择了差分前缀和
参考文章
核心:
q+k≤ti≤q+k+ci-1
不妨转化一下:
ti-k-ci+1≤q≤ti-k
#include<stdio.h>
#include<iostream>
#include<math.h>
using namespace std;
const int N = 2e5+10;
int main() {
int n, m, k,p;
cin >> n >> m >> k;
int d[N] = { 0 };
int t, c;
for (int i = 0; i < n; i++) {
cin >> t >> c;
d[max(1, t - k - c + 1)]++;
d[max(1, t - k+1)]--;
}
for (int i = 0; i < N; i++) {
if(i>=1) d[i] += d[i - 1];
}
for (int i = 0; i < m; i++) {
cin >> p;
cout << d[p]<<endl;
}
return 0;
}
满分答案