[POJ 3067]

Japan

树状数组

题意是,在左右两边各有m和n个点的二分图中有k条边(xi,yi),问这k条边之间两两相交了多少次(端点不算)。

首先读入每条边,然后按x由小到大排序,初始化ans=0,然后重复:
(1)将xi连续相同的一组边加入图中;
(2)对下一组中的每条边j,求与之前的边相交的次数,由于之前的边必有x<xj,因此求y>yj的边数即可。
最后输出ans即为答案。

其中的(1)和(2)可以用树状数组来实现:通过O(lgn)地修改、询问,可以使总时间复杂度达到O(klgn)。

树状数组的实现有个小技巧,x&-x可以O(1)地取到x最低位的1。