#P13913. [CSPro 26] 光线追踪

[CSPro 26] 光线追踪

题目背景

洛谷的测试数据仅供民间交流使用,非官方测试数据。官方评测链接:https://www.cspro.org/

题目描述

光线追踪是计算机图形学领域的一个重要算法,其原理是追踪一束从光源发出的光,经过不同的反射面,最终到达摄像机处的过程。

在这道问题中,你需要实现一段程序来处理一个简易的光线追踪模型。

在平面中有一些反射面,为方便起见,我们设这些反射面都是线段,与坐标轴成 45 度角摆放,且两个端点的坐标均为整数。为进一步简化问题,我们假设所有的反射表面都是镜面反射。任何一束光线照射到反射面上(为避免讨论,假设反射面不含端点)时,都会改变方向为相应的镜面反射方向。注意,反射面的两侧都可以反射光线。

平面中还有一些激光光源,每个光源位于一个坐标为整数的点上,会向某个水平或竖直的方向发射一定强度的激光。

所有的反射面都不是完美的,每个反射面有一个折损系数 aa,当强度为 II 的光线照射上去时,反射光线的强度会变成 aIaI。为了便于处理,你可以认为所有反射面的材质均不算太好也不算太糟,因此所有的 aa 均在 0.20.80.2 \sim 0.8 的范围内。

在一些超高速摄影问题中,有时甚至连光速都要考虑在内。在这个问题中,我们不妨假设激光在 1 单位时间内恰好移动 1 单位距离。然而,超高速摄影带来的往往是采样精度的损失,因此对于一束激光,最终采样到的光线强度都是向下取整后的数值。特别地,当一束激光的强度小于 1 时,认为其已经完全耗散。

问题的最开始,平面上没有反射面也没有光源。接下来你需要处理若干个操作,每个操作形如:

1 x1 y1 x2 y2 a:在平面上插入一个分别以 (x1,y1)(x_1, y_1)(x2,y2)(x_2, y_2) 为端点,反射系数为 aa 的反射面,保证反射面与坐标轴成 45 度角摆放,且不与先前已经存在、且还没有被删除的反射面在非端点处相交;另外受到渲染效率的影响,问题中的所有反射面的总长度(可以理解为所有的 x1x2|x_1 - x_2| 之和)不会太大。

2 k:删除第 kk 个操作插入的反射面,保证第 kk 个操作发生在当前操作之前且为一个插入操作,且这个反射面还没有被删除;

3 x y d I t:在 (x,y)(x, y) 位置放置一个光源,发射光线的方向为 dd,强度为 II,求其所经 tt 时刻后光线到达的坐标以及采样得到的光线强度。其中 dd 的含义为:d=0d = 0 表示沿 xx 坐标增加的方向,d=1d = 1 表示沿 yy 坐标增加的方向,d=2d = 2 表示沿 xx 坐标减小的方向,d=3d = 3 表示沿 yy 坐标减小的方向。另外,保证光源不位于当前存在的某个反射面(不含端点)上。注意:如果 tt 时刻后光线刚好到达某个反射面,则其强度取反射后的强度。

输入格式

从标准输入读入数据。

第 1 行,一个正整数 mm 表示操作的总数量。

接下来 mm 行,每行描述一个操作,格式如题目描述。

其中,除了所有的 aaII 以外的输入均为绝对值不超过 10910^9 的整数,其中 kktt 为正整数;aaII 均为小数点后不超过 6 位的正实数,其中 aa0.20.80.2 \sim 0.8 之间,I109I \leq 10^9

输出格式

输出到标准输出。

对于每个查询操作输出一行,33 个整数,形如 x y Ix\ y\ I 表示激光最终到达的位置为 (x,y)(x, y),采样得到的光线强度为 II。特别地,如果采样到的光线强度为 00(即光线已耗散),你也无需关心最终到达的坐标,而只需要输出 0 0 00\ 0\ 0 即可。

题目数据保证,你可以在计算时直接使用 6464 位浮点数的运算和取整操作,而无需担心可能的精度误差问题。

7
1 0 4 2 2 0.4
1 2 2 0 0 0.45
3 -1 3 0 6 5
3 1 5 3 2.4 5
3 0 2 0 3 4
2 1
3 1 5 3 2.4 5
0 1 1
0 0 0
4 2 3
0 1 1

提示

数据范围

::cute-table{tuack}

测试点编号 mm \leq 特殊性质
131 \sim 3 10001000 所有光线的 t1000t \leq 1000,所有输入坐标的绝对值 1000\leq 1000
474 \sim 7 ^
8108 \sim 10 10510^5 所有光线的 t10t \leq 10
111311 \sim 13 ^ 所有 1 操作在所有 3 操作之前,且无 2 操作
141614 \sim 16 所有光线的 I=1I = 1
172017 \sim 20

对于 100%100\% 的数据,保证 m105m \leq 10^5,所有反射面的 x1x2|x_1 - x_2| 之和不超过 3×1053 \times 10^5