描述
传送门:http://poj.org/problem?id=2352
在笛卡尔坐标系上,有很多的猩猩,对于某一只猩猩,它的等级等于位置在它左下方的猩猩的数目。
换句话说,设一个猩猩的坐标为 $(x_0,y_0)$,那它的等级就是所有坐标为 $(x,y)$ 的猩猩的数目,其中 $x\leqslant x_0, y\leqslant y_0$ 。
一共有 $N$ 只猩猩,问你从等级 $0$ 到 $N-1$,各有多少只猩猩。
思路
考虑用树状数组求解,首先将坐标排序,按纵坐标从小到大,纵坐标相同时横坐标从小到大。虽然本题已经排好了,但我们仍然有必要知道为何要这样排,下面解释。
我们按照排列好的顺序依次计算,就能保证当计算到某一只猩猩的时候,满足计算它等级条件的所有猩猩都已经提前计算完了,假设这只猩猩坐标是 $(x_0,y_0)$,那它的等级就是 $Sum(x_0)$,然后再将这只猩猩也加入到树状数组当中,即 $Modify(x_0)$。我们只需要在计算等级的时候记录一下就可以了。
另外这题设置了一个小坑,我们知道树状数组和线段树这类数据结构在计算的时候,下标是必须从 1 开始的。
在本题中,我们以 $x$ 坐标建树,但题目中给出的 $x$ 是可以等于 $0$ 的,所以我们需要将所有的 $x$ 坐标加 $1$,把所有猩猩右移一位,计算结果保持不变。
代码
1 |
|
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GuKaifeng's Blog!
评论(延迟加载 / 需要可访问 GitHub Issues)