HDU 1556 Color the ball【树状数组+区间更新】
2014-09-24 22:44
411 查看
Color the ball
Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 9604 Accepted Submission(s): 4946
Problem Description
N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的“小飞鸽"牌电动车从气球a开始到气球b依次给每个气球涂一次颜色。但是N次以后lele已经忘记了第I个气球已经涂过几次颜色了,你能帮他算出每个气球被涂过几次颜色吗?
Input
每个测试实例第一行为一个整数N,(N <= 100000).接下来的N行,每行包括2个整数a b(1 <= a <= b <= N)。
当N = 0,输入结束。
Output
每个测试实例输出一行,包括N个整数,第I个数代表第I个气球总共被涂色的次数。
Sample Input
3 1 1 2 2 3 3 3 1 1 1 2 1 3 0
Sample Output
1 1 1 3 2 1
//题解:
树状数组入门:
这里有详解:
http://blog.csdn.net/u013365671/article/details/25562181
这里的getsum(I),求得前i个数的和,这里是第i个气球涂色次数。
#include<cstdio> #include<cstring> int c[100002],n; int lowbit(int x)//子节点与父节点之间的距离lowbit(x); { return x&(-x); } int getsum(int x)//数组和 { int result = 0; while(x>0) { result += c[x]; x -= lowbit(x); } return result; } void update(int x,int value)//更新 { while(x<=n) { c[x]+=value; x+=lowbit(x); } } void solve(){ int x,y,i; while(scanf("%d",&n)&&n) { memset(c,0,sizeof(c)); int t = n; while(t--) { scanf("%d %d",&x,&y); update(x,1); update(y+1,-1); } for(i=1; i<n; ++i) printf("%d ",getsum(i)); printf("%d\n",getsum(n)); } } int main() { solve(); return 0; }
相关文章推荐
- HDU~1556 Color the ball(线段树区间更新||树状数组)
- HDU 1556 Color the ball(线段树区间更新)
- HDU 1556 Color the ball【线段树区间更新,一次查询+数组模拟】
- hdu 1556 Color the ball(区间更新,查询点)
- HDU 1556-Color the ball(线段树区间更新)
- hdu 1556 Color the ball(线段树 区间更新单点查询)
- hdu 1556 color the ball (数状数组 区间更新)
- hdu 1556 color the ball 线段树区间更新 加lazy标记
- HDU - 1556 Color the ball (线段树 + 区间更新)
- HDU - 1556 Color the ball 区间更新
- hdu 1556:Color the ball(第二类树状数组 —— 区间更新,点求和)
- HDU 1556 Color the ball [区间更新+单点查询]
- HDU 1556 Color the ball 很典型的更新区间查找点的题(线段树树状数组两种解法)
- HDU 1556 Color the ball 线段树 区间更新
- hdu 1556 Color the ball(区间更新,单点求值)
- HDU 1556 Color the ball(线段树区间更新)
- HDU 1556 Color the ball 树状数组-区间更新-模板
- HDU 1556 Color the ball (一维树状数组,区间更新,单点查询)
- HDU 1556 Color the ball (树状数组区间更新)
- HDU-1556-Color the ball-线段树+区间更新+单点查询