有一些点,某个点的 level 被定义为在它左下的点的个数,问各 level 各有多少点。
由于输入时 y 坐标是增序来的,所以可以忽略 y,用一个树状数组 c [ x ] ,来表示目前在坐标 x 以左的点的个数。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int c[40000];
int lowBit(int x){
return x & (-x);
}
void update(int x){
while(x < 40000){
c[x]++;
x += lowBit(x);
}
}
int getSum(int x){
int sum = 0;
while(x > 0){
sum += c[x];
x -= lowBit(x);
}
return sum;
}
int main(){
int N;
int lvl[40000];
cin >> N;
memset(lvl, 0, sizeof(lvl));
for(int i = 0; i < N; i++){
int x, y;
scanf("%d%d", &x, &y);
x++;
lvl[getSum(x)]++;
update(x);
}
for(int i = 0; i < N; i++){
printf("%d\n", lvl[i]);
}
}
本文介绍了一种使用树状数组解决特定几何问题的方法:计算二维平面上各点的级别,即该点左侧下方点的数量。通过遍历输入并利用树状数组更新和查询功能,实现了高效地统计不同级别点的数量。
&spm=1001.2101.3001.5002&articleId=7742401&d=1&t=3&u=bbcb23ad11334bae83ad96032cc4abf7)
255

被折叠的 条评论
为什么被折叠?



