数星星(树状数组模板题)

简介: 数星星(树状数组模板题)

天空中有一些星星,这些星星都在不同的位置,每个星星有个坐标。如果一个星星的左下方(包含正左和正下)有 k颗星星,就说这颗星星是 k 级的。


例如,上图中星星 5 是 3 级的(1,2,4在它左下),星星 2,4是 1 级的。例图中有 1 个 0 级,2 个 1 级,1 个 2 级,1 个 3 级的星星。


7532b929e2f6552462eb109af9902338.png


给定星星的位置,输出各级星星的数目。


一句话题意    给定 n 个点,定义每个点的等级是在该点左下方(含正左、正下)的点的数目,试统计每个等级有多少个点。


输入格式


第一行一个整数 N,表示星星的数目;

接下来 N 行给出每颗星星的坐标,坐标用两个整数 x,y表示;

不会有星星重叠。星星按 y 坐标增序给出,y 坐标相同的按 x 坐标增序给出。


输出格式

N 行,每行一个整数,分别是 0级,1 级,2级,……,N−1 级的星星的数目。


样例

Input Output
1. 5
2. 1 1
3. 5 1
4. 7 1
5. 3 3
6. 5 5
1. 1
2. 2
3. 1
4. 1
5. 0


有事你就q我;QQ2917366383


学习算法


我们可以知道这个可以暴力但是可能会超限,所以我们用树状数组;下面是ac代码,重点处都备注好了。

#include<cstdio>
const int maxn=1e6+7;//大家不要用暴力解法,有时候会卡数据 
int c[maxn], b[maxn];   
int n, x, y;
int Lowbit(int x){
  return x&(-x);
}
void update(int x, int y){
  for(int i = x; i <= 32001; i+=Lowbit(i))// 将x位置的树状数组都加1 
    c[i] += y;
}
int sum(int x){
  int sumn=0;
  for(int i = x; i > 0; i-=Lowbit(i))//累加星星 
    sumn += c[i];
  return sumn;
}
int main(){
  scanf("%d", &n); 
  for(int i = 1; i <= n; i++){
    scanf("%d%d", &x,&y);//题目说了是按照顺序排的,所以我们可以直接用 
      b[sum(x+1)]++;//将sum(x+1)的值比做有几个星星 
          update(x+1, 1); //统计星星个数 
  //顺便提一下这里x+1是为了防止在sum(1)时报错 ,加1不影响结果 
  } 
  for(int i = 0; i < n; i++)
    printf("%d\n", b[i]); 
  return 0;//此处掌声 
}
相关文章
|
1月前
|
人工智能 算法 C语言
详解树状数组(C/C++)
详解树状数组(C/C++)
|
6月前
|
索引 NoSQL 容器
树状数组与线段树
树状数组与线段树
|
机器学习/深度学习 存储 C++
[蓝桥杯] 树状数组与线段树问题(C/C++)
[蓝桥杯] 树状数组与线段树问题(C/C++)
79 0
|
算法
并查集模板题
并查集模板题
48 0
|
人工智能 算法 搜索推荐
LeetCode 周赛 338,贪心 / 埃氏筛 / 欧氏线性筛 / 前缀和 / 二分查找 / 拓扑排序
大家好,我是小彭。 上周末是 LeetCode 第 338 场周赛,你参加了吗?这场周赛覆盖的知识点很多,第四题称得上是近期几场周赛的天花板。
111 0
|
人工智能 索引
树状数组总结
能够解决数据压缩里的累积频率的计算问题,现多用于高效计算数列的前缀和、区间和。
119 0
树状数组总结
一道题学会二分+前缀和+双指针+单调队列+RMQ+线段树,真正实现一题多解
一道题学会二分+前缀和+双指针+单调队列+RMQ+线段树,真正实现一题多解
一道题学会二分+前缀和+双指针+单调队列+RMQ+线段树,真正实现一题多解