什么是线段树,超详细讲解
思路
考虑以每个身高作为下标,维护每个身高的数量,很显然不同的身高最多有 2 × 1 0 5 2\times 10^5 2×105 个,考虑离散化,代码如下:
for (int i = 1; i <= n; i ++) {
int x = a[i].v;
a[i].v = lower_bound(b + 1, b + idx + 1, a[i].v) - b; // 二分查找该元素的位置,保存离散化
vis[a[i].v] = x;
}
用线段树维护每种身高数量的和,线段树上二分即可,具体细节看代码。
细节
- 考虑到要求的是身高,直接记录一下身高 x x x 离散化前的数字即可(这一步建议大家使用 S T L STL STL 的
lower_bound
,不然很容易错)。 - 在线段树叶子结点记录下当前节点代表的身高是多少。
代码(重点是注释)
#include <bits/stdc++.h> // 包含所有标准库
#define int long long // 使用宏定义将int重新定义为长整型,以支持