C++未优化版【70分】【从人的角度考虑问题】
#include<iostream>
#include<algorithm>
#include<map>
using namespace std;
struct plan{
int t;
int c;
}P[100000+1];
int main(){
int n,m,k;
cin>>n>>m>>k;
for(int i=1;i<=n;i++){
int t,c;
cin>>t>>c;
P[i].t = t;
P[i].c = c;
}
while(m--){
int q;
cin>>q;
int count = 0;
//从人的角度,每做一次核酸,就查询进入场所的时间t是否在核酸检测结果出来[q+k]后,c小时内
for(int i=1;i<=n;i++){
if(q+k<=P[i].t && P[i].t<=(q+k+P[i].c-1))
count++;
}
cout<<count<<endl;
}
}
C++优化版
基于未优化版本,考虑将n个出行计划的查询(即内层for循环)放到外层循环之外。对于每个查询(即每个核酸检测),获得核酸检测结果的时间点,求出其被多少个出行计划所覆盖。问题变为:在O(n)时间内,求出每个查询获得的核酸结果时间点被多少个出行计划所覆盖。