题意
坐标系上,在
x
x
x轴上方有
n
n
n个
A
A
A类点和
k
k
k个平行于
x
x
x轴的障碍线段,在
x
x
x轴下方有
m
m
m个
B
B
B类点,求每个
B
B
B类点能看到的
A
A
A类点的个数(指不被任意一个障碍遮住)。
B类点强制在线给出。
数据范围:
n
,
m
≤
100000
,
k
≤
50
n,m\le 100000,k\le 50
n,m≤100000,k≤50
题解
注意到
k
k
k很小,考虑以障碍为中转点计算答案。
有一个部分分是所有
B
B
B类点纵坐标相等(设为
y
y
y),可以把
A
A
A类点与每个障碍的连线映射到与直线
y
y
y的交点,求出并集后进行区间加,对于每一个
B
B
B类点减掉包含它的区间个数即可。
由此拓展到一般情况:如果将连线映射到x轴上不能限制B类点的所有区间都不包含于对应
A
A
A类点区间。发现
A
A
A类点的每个不相交区间相当于把属于那一块的
B
B
B类点减
1
1
1,而效率不允许在枚举B类点的同时考虑每一个
A
A
A类点,考虑把该贡献拆开:在左端点
−
1
-1
−1,在右端点
+
1
+1
+1。于是对于每个
B
B
B类点,考虑每个端点对其贡献:一开始答案是
n
n
n,每经过一个左端点的直线就-1,右端点就+1。这样只要对于每个端点算出在它左边的直线有几条即可,可直接排序预处理后二分算出。