题意
lantian有一个美丽的大花园,因为他喜欢在黄昏后欣赏花园的美丽,他在花园中安装了许多盏灯。
这些灯是有方向的,它们只会朝一个确定的夹角内发光。而且,lantian把它们安放的很整齐,所以它们都朝向同一个方向。
这些灯都是太阳能灯,它们使用的是太阳能而不是电能。第 $ i $ 盏灯会发光当且仅当至少 $ k_i $ 盏灯照到了它或者它通了电。
现在,lantian将按 $ 1 $ 到 $ n $ 的顺序给每盏灯通电,即在第 $ i $ 个时刻给第 $ i $ 盏灯通电。最后,lantian想知道每盏灯从哪一个时刻开始发光,请写一个程序回答这个问题。
题解
首先那个夹角的范围直接看不好做,考虑转化为直角坐标系。即以所给的两条射线的方向向量为基底,每个点用它们表示为直角坐标系的坐标。注意到两条射线共线时会有问题,把其中一条偏转一下,变为一个极小的夹角即可。
于是问题转化为直角坐标系上的 n n n个点,第 i i i个点在时刻i被点亮,如果它的左下角有不少于 k i k_i ki个点被点亮时它也被点亮,求每个点第一次被点亮的时间。
由于这个过程是动态的,即一个点被点亮时会影响它右上的点,被点亮的又会继续去影响,且每个点的 k i k_i ki不同,直接做不好找到哪些点有影响,不好维护。而我们关心的又是时间,如果我们能知道在一个时间前被点亮的点有影响,那么直接考虑编号小于这个时间的点的影响,并在该过程中把这个时间内被点亮的点的影响加入,就可以把所有点被点亮的时间分为前后两部分。
于是考虑整体二分,记当前 [ a , b ] [a,b] [a,b]内的点在时间 [ l , r ] [l,r] [l,r]内被点亮,按照 x x x为第一关键字, y y y为第二关键字排序,用以 y y y为关键字的树状数组维护找出每个点右下角的点数,即可找出 m i d mid mid之前被点亮的点,递归下去做即可。