这道题实际上是利用差分进行计算,也就是进行区间修改
我们可以大概找一下思路,首先我们的数据来说,我们能够正常进行计划的做核酸的时间是
q
+
k
≤
t
≤
q
+
k
+
c
−
1
q +k le t leq q+k+c-1
q+k≤t≤q+k+c−1
我们可以看到,只要满足这个条件,我们就可以完成我们计划,所以我们需要对这个区间的值都进行+1的操作,对于差分数组来说,我们就只需要对两端进行操作,也就是
t
[
l
]
+
=
1
,
t
[
r
+
1
]
−
=
1
t[l]+=1,t[r+1]-=1
t[l]+=1,t[r+1]−=1
我们还可以对这个公式进行一个转化
t
−
k
−
c
+
1
≤
q
≤
t
−
k
t-k-c+1 le q le t - k
t−k−c+1≤q≤t−k
所以我们只需要得到我们的q在这个
[
t
−
l
−
c
+
1
,
t
−
k
]
[t-l-c+1,t-k]
[t−l−c+1,t−k]上的值,就是我们的计划的数。
之后对差分数组求和,就可以得到计划的数,计算这里面的值,最后的 d i f f [ q ] diff[q] diff[q]就是我们的结果。
代码# http://118.190.20.162/view.page?gpid=T142
n,m,k = map(int,input().split())
N = 200010
diff = [0]*N
for i in range(n):
t,c = map(int,input().split())
# 在【l, r】时间段内做核酸,则t时刻可进入
l = max(t-k-c+1,0)
r = max(t-k,0)
# 在【l, r】时间段内能出行的计划个数加一
diff[l] += 1
diff[r+1] -= 1
# 利用差分计算每个时间的能出行个数
for i in range(1,N):
diff[i] += diff[i-1]
for j in range(m):
q = int(input())
res = diff[q]
print(res)



