poj 2352 stars(树状数组)
题目链接:http://poj.org/problem?id=2352
题意:给出n个星星的坐标,每个星星的等级为纵坐标小于等于它且横坐标小于等于它的星星数,最后按顺序输出等级分别为0至n-1的的星星数。
分析:这题属于树状数组的基础题。
根据观察题目中给出的输入数据的性质就可以发现,在每颗星星的坐标被输入时,
它的等级已经确定(所有满足条件的星星都已经在它之前给出)。
而且它保证了之前的每一颗星星都满足纵坐标的条件,
所以我们只需要统计当前横坐标小于等于Xi的星星个数就可以计算出Stari的等级了,
所以通过使用一个树状数组统计每个横坐标位置上有多少颗星星即可了。
需要注意的是为了使树状数组的下标从一开始,我们在读入之后应该将横坐标+1之后在进行统计。
AC代码如下:

1 #include<stdio.h> 2 #include<string.h> 3 #define N 32010 4 int d[32010],cnt[15010]; 5 int lowbit(int x) 6 { 7 return x&(-x); 8 } 9 int GetSum(int x) 10 { 11 int s=0; 12 while(x>0) 13 { 14 s+=d[x]; 15 x-=lowbit(x); 16 } 17 return s; 18 } 19 void update(int x,int num) 20 { 21 while(x<N) 22 { 23 d[x]+=num; 24 x+=lowbit(x); 25 } 26 } 27 int main() 28 { 29 int n,i,x,y; 30 scanf("%d",&n); 31 memset(d,0,sizeof(d)); 32 memset(cnt,0,sizeof(cnt)); 33 for(i=0;i<n;i++) 34 { 35 scanf("%d%d",&x,&y); 36 cnt[GetSum(x+1)]++; 37 update(x+1,1); 38 } 39 for(i=0;i<n;i++) 40 printf("%d\n",cnt[i]); 41 return 0; 42 }
分类:
ACM算法
posted on 2013-08-15 10:59 jumpingfrog0 阅读(194) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具