CSP 202203-2 出行计划

思路:

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;
 } 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值