题目描述
考虑一个二维平面,摄像机在(0,0)(0,0)的位置,初始时平面上没有障碍物。现在执行QQ次操作,操作有两种(假设这是第ii次操作,1≤i≤Q1≤i≤Q):
1、给定x0,y0,x1,y1(x0
2、给定向量(x,y)(x,y),会有一个动点从摄像机所在的(0,0)(0,0)位置出发,以(x,y)(x,y)所指的方向前进,直到碰到第一个障碍物为止。
对于第2种操作,输出最先碰到的障碍物的编号。若不会碰到任何障碍物,输出0。
输入
输入文件第一行一个正整数QQ,表示操作总数。
接下来的QQ行,每行第一个正整数opiopi为操作种类(保证为1或2)。如果为1,则接下来四个正整数x0,y0,x1,y1(x0
输出
输出文件包含RR行(RR为第2种操作的总数),每行一个正整数,表示第一个碰到的障碍物编号。
样例输入
10
1 3 3 10 4
1 4 2 5 6
2 6 2
1 2 8 4 10
1 0 6 3 9
2 5 2
2 8 6
2 2 9
2 4 7
1 5 7 10 10
样例输出
1
2
2
5
0
提示
样例2
样例解释
在9次操作之后,平面的一部分如图所示(箭头为所有第2种操作询问的路线)。
数据范围
对于30% 的数据:Q≤1000Q≤1000。
对于另外30% 的数据:0≤x0,y0,x1,y1,x,y≤2000≤x0,y0,x1,y1,x,y≤200。
对于100% 的数据:Q≤105,0≤x0,y0,x1,y1,x,y≤109,x0
来源
noip2018模拟-南外
题解:
一个障碍物可以挡住一个范围以内的斜率,依照这个,我们可以以斜率为下标建立一个线段树,里面维护的是斜率为k第一个遇到的障碍物编号。然而我们可能交一个障碍物于侧面或者下面,所以要把横纵坐标分开维护,开两个线段树维护,具体实现比较繁琐,代码实现能力有待提高。。。。。。。
#include
#include
#include
#include
#include