当前位置: 首页> 健康> 科研 > 蓝桥杯真题——数星星

蓝桥杯真题——数星星

时间:2025/8/29 10:15:35来源:https://blog.csdn.net/2301_79363050/article/details/142217895 浏览次数:0次

输入样例:

5
1 1
5 1
7 1
3 3
5 5

输出样例:

1
2
1
1
0

分析:

根据题目,是逐行读入数据,我们要求每颗星星左下方的星星数量,就是要迅速求一个区间内的值

于是我们联想到树状数组来解决问题

代码演示:

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;const int N = 15010,M = N*2;
int n;
int tr[M],level[N];// 树状数组的基本三个函数 
int lowbit(int x)
{return x&-x;
}// 寻找前驱结点,快速得到前缀和 
int query(int x)
{int res = 0;for(int i=x;i;i-=lowbit(i)){res+=tr[i];}return res;
}// 改变某一个数的值,要将祖先也改变 
void add(int x,int v)
{for(int i=x;i<M;i+=lowbit(i))tr[i]+=v;return;
}int main(void)
{scanf("%d",&n);for(int i=0;i<n;i++){int x,y;scanf("%d%d",&x,&y);// lowbit(0)=0会导致死循环// 要将所有坐标向右平移一个点位,不影响 x++;// 看前面有没有存储的值 int t = query(x);// 星星值 level[t]++;// 构造树状数组 add(x,1);}for(int i=0;i<n;i++){scanf("%d\n",level[i]);}return 0;
}

感谢查看!

关键字:蓝桥杯真题——数星星

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: