CSP 202203-2 出行计划 python 差分算法

CSP 202203-2 出行计划 python 差分算法

题目描述

在这里插入图片描述
在这里插入图片描述

思路

这道题实际上是利用差分进行计算,也就是进行区间修改

我们可以大概找一下思路,首先我们的数据来说,我们能够正常进行计划的做核酸的时间是
q + k ≤ t ≤ q + k + c − 1 q +k \le t \leq q+k+c-1 q+ktq+k+c1
我们可以看到,只要满足这个条件,我们就可以完成我们计划,所以我们需要对这个区间的值都进行+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 tkc+1qtk
所以我们只需要得到我们的q在这个 [ t − l − c + 1 , t − k ] [t-l-c+1,t-k] [tlc+1,tk]上的值,就是我们的计划的数。

之后对差分数组求和,就可以得到计划的数,计算这里面的值,最后的 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)

猜你喜欢

转载自blog.csdn.net/weixin_45508265/article/details/125051854