问题分析:
差分板子。根据题意描述可以反推得到对于每个出行计划合法的核酸检测的时间区间。假设在x时刻进入公共场所,其需要c小时内的核酸证明,k小时候出核酸结果可以推出这个合法区间为 [ x − k − c + 1 , x − k + 1 ] [x-k-c+1, x-k+1] [x−k−c+1,x−k+1]。将这个区间内所有值都加1,统计完所有出行计划后,根据前缀和可以计算每个时刻做核酸可以满足的出行计划个数,直接查询即可。
完整代码
void solve()
{
int n,m,k;
cin>>n>>m>>k;
int d[200005] = {0};
for(int i=0;i<n;i++)
{
int x,c;
cin>>x>>c;
if(x -k <=0) continue;
int mi = max(0, x-k-c+1);
d[mi]++;
d[x-k+1]--;
}
int sum[200005] = {0};
sum[0] = d[0];
for(int i=1;i<=200005;i++)
sum[i] = sum[i-1] + d[i];
for(int i=0;i<m;i++)
{
int q;
cin>>q;
cout<<sum[q]<<endl;
}
}