问题描述
问题链接:光线追踪
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+