CCF CSP——202206-4 光线追踪

问题描述

问题链接:光线追踪

85题解

首先,非常感谢一位大佬,这道题我做了很久始终超时,于是乎,我放弃了,便开始寻找这道题的满分题解,于是我找到了如下链接:python满分题解:CCF202206-4 光线追踪_云里云空的博客-CSDN博客

建议大家直接去看这位大佬的题解吧,写的挺详细的

简单说一下核心思路:

1、因镜子上的点不超过3 * 10^5,因此可以将所有的点保存下来

2、保存方式用map的方式,两个map分别以x,y做为键,y,x做为值并递增排序

3、排序后查找用二分查找,降低查找的时间复杂度

然后我就依据这位大佬的思路,自己去实现了一下,然而只有85分

分享一下我自己的python代码(写的很丑,也不想提升了,摆烂!!!)


n = int(input())
points_x = dict()
# {x:[(y,id)]}
points_y = dict()
mirror = dict()
# {id:(x1,x2,d,a,uod)}

def find(nums, target, left, right, flag):
    mid = (left + right) // 2
    if target < nums[0][0]:
        return flag >> 1
    elif target > nums[right][0]:
        return right + (flag >> 1) + 1
    if nums[mid][0] == target:
        return mid + flag
    elif nums[mid][0] < target < nums[mid+1][0]:
        return mid + (flag >> 1) + 1
    elif target < nums[mid][0]:
        return find(nums, target, left, mid, flag)
    else:
        return find(nums, target, mid+1, right, flag)


for i in range(n):
    option = input().split()
    if option[0] == '1':
        d1 = int(option[1]), int(option[2])
        d2 = int(option[3]), int(option[4])
        if d1[0] > d2[0]:
            d1, d2 = d2, d1
        a = float(option[5])
        uod = 1 if d1[1] < d2[1] else -1
        d = d1[1] - uod * d1[0]
        for ind, x in enumerate(range(d1[0]+1, d2[0])):
            point = d1[0] + ind + 1, d1[1] + (ind + 1) * uod
            if point[0] not in points_x:
                points_x[point[0]] = [(point[1], i+1)]
            else:
                points_x[point[0]].insert(find(points_x[point[0]], point[1], 0, len(points_x[point[0]]) - 1, 0),
                                          (point[1], i+1))
            if point[1] not in points_y:
                points_y[point[1]] = [(point[0], i+1)]
            else:
                points_y[point[1]].insert(find(points_y[point[1]], point[0], 0, len(points_y[point[1]]) - 1, 0),
                                          (point[0], i+1))
        mirror[i+1] = d1[0], d2[0], d, a, uod
    elif option[0] == '2':
        id = int(option[1])
        down_x, up_x, d, _, uod = mirror[id]
        for j in range(down_x+1, up_x):
            point = j, uod * j + d
            points_x[point[0]].pop(find(points_x[point[0]], point[1], 0, len(points_x[point[0]]) - 1, 0))
            if not points_x[point[0]]:
                points_x.pop(point[0])
            points_y[point[1]].pop(find(points_y[point[1]], point[0], 0, len(points_y[point[1]]) - 1, 0))
            if not points_y[point[1]]:
                points_y.pop(point[1])
        mirror.pop(id)
    elif option[0] == '3':
        obj = dict()
        obj["p"] = [int(option[1]), int(option[2])]
        obj["d"] = int(option[3])
        obj["I"] = float(option[4])
        obj["t"] = int(option[5])
        while obj["t"] > 0:
            if obj["I"] < 1:
                break
            if obj["d"] == 0:
                if obj["p"][1] not in points_y:
                    obj["p"][0] += obj["t"]
                    break
                index = find(points_y[obj["p"][1]], obj["p"][0], 0, len(points_y[obj["p"][1]])-1, 1)
                if index == len(points_y[obj["p"][1]]) or points_y[obj["p"][1]][index][0] - obj["p"][0] > obj["t"]:
                    #走到死
                    obj["p"][0] += obj["t"]
                    break
                else:
                    _, _, d, a, uod = mirror[points_y[obj["p"][1]][index][1]]
                    obj["t"] -= points_y[obj["p"][1]][index][0] - obj["p"][0]
                    obj["p"][0] = points_y[obj["p"][1]][index][0]
                    if uod == 1:
                        obj["d"] = 1
                    else:
                        obj["d"] = 3
                    obj["I"] *= a

            elif obj["d"] == 2:
                if obj["p"][1] not in points_y:
                    obj["p"][0] -= obj["t"]
                    break
                index = find(points_y[obj["p"][1]], obj["p"][0], 0, len(points_y[obj["p"][1]]) - 1, -1)
                if index == -1 or obj["p"][0] - points_y[obj["p"][1]][index][0] > obj["t"]:
                    obj["p"][0] -= obj["t"]
                    break
                else:
                    _, _, d, a, uod = mirror[points_y[obj["p"][1]][index][1]]
                    obj["t"] -= obj["p"][0] - points_y[obj["p"][1]][index][0]
                    obj["p"][0] = points_y[obj["p"][1]][index][0]
                    if uod == 1:
                        obj["d"] = 3
                    else:
                        obj["d"] = 1
                    obj["I"] *= a

            elif obj["d"] == 1:
                if obj["p"][0] not in points_x:
                    obj["p"][1] += obj["t"]
                    break
                index = find(points_x[obj["p"][0]], obj["p"][1], 0, len(points_x[obj["p"][0]]) - 1, 1)
                if index == len(points_x[obj["p"][0]]) or points_x[obj["p"][0]][index][0] - obj["p"][1] > obj["t"]:
                    obj["p"][1] += obj["t"]
                    break
                else:
                    _, _, d, a, uod = mirror[points_x[obj["p"][0]][index][1]]
                    obj["t"] -= points_x[obj["p"][0]][index][0] - obj["p"][1]
                    obj["p"][1] = points_x[obj["p"][0]][index][0]
                    if uod == 1:
                        obj["d"] = 0
                    else:
                        obj["d"] = 2
                    obj["I"] *= a

            elif obj["d"] == 3:
                if obj["p"][0] not in points_x:
                    obj["p"][1] -= obj["t"]
                    break
                index = find(points_x[obj["p"][0]], obj["p"][1], 0, len(points_x[obj["p"][0]]) - 1, -1)
                if index == -1 or obj["p"][1] - points_x[obj["p"][0]][index][0] > obj["t"]:
                    obj["p"][1] -= obj["t"]
                    break
                else:
                    _, _, d, a, uod = mirror[points_x[obj["p"][0]][index][1]]
                    obj["t"] -= obj["p"][1] - points_x[obj["p"][0]][index][0]
                    obj["p"][1] = points_x[obj["p"][0]][index][0]
                    if uod == 1:
                        obj["d"] = 2
                    else:
                        obj["d"] = 0
                    obj["I"] *= a
        if obj["I"] < 1:
            print(0, 0, 0)
        else:
            print(obj["p"][0], obj["p"][1], int(obj["I"]))

写在最后

能看到这里的都是帅哥美女,祝大家csp400+

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值