csp 2022.3

202203-1 未初始化警告

 

 解答:

import sys
n,k = map(int,sys.stdin.readline().split())
x_flag = [False]*(n+1) #k条语句,n个变量,从1到n
x_flag[0] = True
# y = [0]*k
num = 0
for i in range(k):
    x,y = map(int,sys.stdin.readline().split())
    if x_flag[y] == False:
        num += 1
    x_flag[x] = True

print(num)

202203-2 出行计划

 

解答:

70分:

import sys
n,m,k = map(int,sys.stdin.readline().split()) #计划数,查询数,等待核酸时间
time_space = [[] for i in range(n)]
for i in range(n):
    end_time,t = map(int,sys.stdin.readline().split())
    start_time = end_time - t + 1
    time_space[i] = [start_time,end_time+1]
q = [0] * m
for i in range(m):
    q[i] = int(input()) + k
for t in q:
    num = 0
    for x in range(n):
        if t in range(time_space[x][0],time_space[x][1]):
            num += 1
            # print(t,x,time_space[x][0],time_space[x][1])
    print(num)


 尝试折半查找优化:

import sys
n,m,k = map(int,sys.stdin.readline().split()) #计划数,查询数,等待核酸时间
time_space_start = [0] * n
time_space_end = [0] * n

def search(qt):
    low = 0
    high = n-1
    mid = 0
    while low <= high:
        mid = (low + high) // 2
        if time_space_end[mid] == qt:
            return mid
        elif time_space_end[mid] > qt:
            high = mid - 1
        elif time_space_end[mid] < qt:
            low = mid + 1
    return low

for i in range(n):
    end_time,t = map(int,sys.stdin.readline().split())
    time_space_start[i] = end_time - t
    time_space_end[i] = end_time

q = [0] * m
for i in range(m):
    q[i] = int(input()) + k
for qt in q:
    num = 0
    t_index = search(qt)
    for x in time_space_start[t_index:]:
        if qt > x:
            num += 1
            # print(qt,x,t_index)
    print(num)


还是超时

100分:

https://blog.csdn.net/m0_62894677/article/details/125796747

参考

import sys
n,m,k = map(int,sys.stdin.readline().split())
N = 2*10**5 + 10
step = [0] * N
ans = [0] * N
for i in range(n):
    t,c = map(int,sys.stdin.readline().split())
    left = max(0,t-k-c+1)
    right1 = max(0,t-k)
    right = min(right1,N)

    step[left] += 1
    step[right + 1] -= 1

ans[0] = step[0]
for i in range(1,N):
    ans[i] = ans[i-1] + step[i]

for i in range(m):
    print(ans[int(input())])

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值