首页 > 代码库 > HDU1556 【树状数组】(改段求点)
HDU1556 【树状数组】(改段求点)
#include<cstdio>#include<algorithm>#include<cstring>#define maxn 100050using namespace std;int b[maxn];int n;int lowbit(int x){ return x&(-x);}void ADD(int x, int c) //向下查询{ for (int i=x; i>0; i-=i&(-i)) b[i] += c;}int SUM(int x) //向上统计{ int s = 0; for (int i=x; i<=n; i+=i&(-i)) s += b[i]; return s;}int main(){ while(scanf("%d",&n)&&n) { int x,y; memset(b,0,sizeof b); for(int i=0; i<n; i++) { scanf("%d%d",&x,&y); ADD(y,1); ADD(x-1,-1); } for(int i=1; i<n; i++) { printf("%d ",SUM(i)); } printf("%d\n",SUM(n)); } return 0;}
心得体会
树状数组主要就分为3种类型。针对这3种类型,我已经转载了一篇文章,里面有3种类型的模板。
做题的时候,只要分清楚是考查哪种类型,然后套模板就可以了。
针对这道题,还有几点要注意的地方。
(1) 不要忘了对数组b进行初始化。
(2)输入 while(scanf("%d",&n)&&n) 的运用,既完成了输入,同时判断了n 是否为0.
(3)输出中的小细节。
前n个数之间存在空格,最后一个数后面不输出空格,直接换行。
注意细节~~~~~
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。