本题询问打招呼次数,但是对于两个人来说,x(ax,bx)x(a_x,b_x)x(ax ,bx ) 和 y(ay,by)y(a_y,b_y)y(ay ,by ),因为两个人是同时出发且速度相同,所以只存在一下三种相遇的方式:
* 运动中相遇,起点相同-------ax==aya_x == a_yax ==ay
* 结束后发生相遇
* 1.终点相同,同时结束---bx==byb_x == b_ybx ==by
* 2.终点不同,其中一个结束,静待另一个经过,发生相遇
本题看似是运动相遇,其实是处理区间交集问题的模型。
因为题目说,这 n 个人的起点和终点都不相同,所以前两种情况不成立,只有第三种情况成立。成立必要条件是,x 先结束,静待 y 经过,那么条件就是 ay<ax<bx<bya_y<a_x<b_x<b_yay <ax <bx <by ;
所以处理思路也就出来了:
* 1.先按照右端点 b 升序排列
* 2.对于每个区间 i ,去前面寻找其它区间 j,在 bj<bib_j<b_ibj <bi 的情况下,去寻找 aj>aia_j>a_iaj >ai 的数量。这个有一点类似于逆序对,用 1 标记每个出现的点,求和就能直接得到数量。
注意:本题数据范围很大,是 10910^9109,用树状数组的话,内存爆掉,需要离散化
怎么找到离散化后,原数字所对应的新的数字呢?直接找数组对应下标,即为其离散化后的数字,注意树状数组下标从 1 开始,所以需要额外 +1。
找到这个数字 id_x 之后,去寻找前面有多少区间左端点是 > id_x 的;
令 m 为离散化的最大值,可以去求 [idx+1,m] 区间之和,通过 [1,m] - [1,id_x] 得到。