思路:
1. 首先考虑到待查询的事项、查询次数较多,因此采用该离线处理的方式:将所有场所的信息处理好后,经由O(1)的时间即可查询;如果涉及计划改动,就可能涉及线段树的使用
2. 如何处理场所信息?题目中并没有提出输出可以出行的计划序号(否则设计线段树即可),因此我们可以忽视序号信息,转而只记录在某一天做核酸可以进入该场所即可。由于在该场所的限制日期内得到核酸(而不是开始做核酸的日期(需要等待k天),注意题目中的限制是核酸结果出来的时间而不是做核酸的时间)即可进入。因此这是一个区间。而对于区间的多次修改,使用差分数组效率更高。
3. 综上所述:我们使用差分数组记录每一个场所对应的合规核酸结果日期范围,由此得来的就是每个日期对应可以进入的场所数量,达到了O(1)的查询速度。
#include <bits/stdc++.h>
using namespace std;
#define MAX 2000005
int plan[MAX] = {};//每一天对应的出行计划数
int main()
{
int n=0,q,k;
cin>>n>>q>>k;
int allday=0;//记录需要考虑的最大日期,在计算差分数组时使用
for(int i=0;i<n;i++)
{
int l,r,k1,now;
cin>>now>>k1;
l = max(0,now-k1+1);//注意越界
r = min(MAX,now+1);//+1是为了使用差分数组
allday = max(allday,r);
plan[l]+=1;
plan[r]-=1;
}
for(int i=1;i<=allday;i++)
{
plan[i]+=plan[i-1];
}
for(int i=0;i<q;i++)
{
int day;
cin>>day;
cout<<plan[day+k]<<endl;
}
return 0;
}