树形数组——摘星星伪题解
树形数组。
题目:摘星星
描述:宇航员经常检测星图,在星图上,星星由点表示而且每颗星星都有笛卡尔坐标。星星的等级表示左下方星星的数量。宇航员想知道星星等级的分布。
例如,如上面图形所示,第5号星等级是3 (它由三个标记为1,2和4的星组成)。标记着2和4的星星的等级是1,在此地图上,0等级的星星只有一个,1等级的有两个,2等级的有一个,3等级的有一个。
你设计一个程序,在给定地图上计算出每个等级星星的数量。
输入:
输入文件“INPUT.TXT”的第一行包含N个星星(1<=N<=60000),
接下来的N行描绘星星的坐标(每行中有两个整数X和Y,由空格分开, 0<=X,Y<=32000)。
在图上的一点只能存在一颗星星,星星根据Y坐标的递增顺序排列,Y坐标相同的星星根据X坐标的递增顺序排列。
输出:
输出文件“OUTPUT.TXT”应包含N 行,一行一个数字,第一行包含0等级星星的数量,第二行包含1等级星星的数量,等等,最后一行包含N-1等级星星的数量。
输入输出示例:
INPUT.TXT OUTPUT.TXT
5 1
1 1 2
5 1 1
7 1 1
3 3 0
5 5
部分解析:此题用树形数组解决,按照x大小排序,然后进行处理。
实际实现:开两个数组,先按照x大小排序,再按照y大小排序。然后再按照x大小依次处理,向前寻找第一个y坐标比当前点小的点(称为目标点),记录下来横坐标和位置,然后向前(后)寻找相同横坐标的点,更新最大的等级数。其中,数组的预处理略过。然后再向前(后)寻与找当前点横坐标相同的点,当纵坐标小于等于当前点的时候,inc(当前点等级数)。最后进行补充,判断是否之前有一些点,在目标点的纵坐标之上,即有可能忽略掉的点,以此类推,更新完一个节点后,反复进行此上操作。(跟树形数组好像没太大关系)但是时间复杂度很高,5T,而且不知为什么前五个点W掉了…… …… ……回头再出正版题解……
<Marvolo原创,严禁转载>