HDOJ 1556 Color the ball
2012-07-15 23:40
253 查看
http://acm.hdu.edu.cn/showproblem.php?pid=1556
树状数组解法:
题意:给N段连续的球上色,求上色后每个球被涂色的次数。
思路:假设有一个数组d,令其的初值为0。若涂色 [ L,R ] 的区间,则令d [ L ] +=1;d [R] - =1;C [ i ] 为对应数组d的前i项和,这样C是 [ L,R ] 的区间就记录了球的涂色次数。因为实际操作时d数组用不到,故可以略去。通过这个技巧就将断更新转化为了点更新,求第i个球涂几次只需求d的先i项和(即C [ i ] )即可。这样就变成一个简单的树状数组求和问题了~
关于C数组和d数组的关系举个例子吧:
第一次涂 [ L,R ] 区间:
下标 1 2 3 4 5 6 7 8 9 ……
C : 0 0 1 1 1 1 0 0 0 ……
d : 0 0 1 0 0 0 -1 0 0 ……
L R R+1
树状数组解法:
题意:给N段连续的球上色,求上色后每个球被涂色的次数。
思路:假设有一个数组d,令其的初值为0。若涂色 [ L,R ] 的区间,则令d [ L ] +=1;d [R] - =1;C [ i ] 为对应数组d的前i项和,这样C是 [ L,R ] 的区间就记录了球的涂色次数。因为实际操作时d数组用不到,故可以略去。通过这个技巧就将断更新转化为了点更新,求第i个球涂几次只需求d的先i项和(即C [ i ] )即可。这样就变成一个简单的树状数组求和问题了~
关于C数组和d数组的关系举个例子吧:
第一次涂 [ L,R ] 区间:
下标 1 2 3 4 5 6 7 8 9 ……
C : 0 0 1 1 1 1 0 0 0 ……
d : 0 0 1 0 0 0 -1 0 0 ……
L R R+1
#include<stdio.h> #include<string.h> #define maxn 111111 int n,C[maxn]; int Lowbit(int x) { return x&(-x); } void updata(int i,int x) { while(i<=n) { C[i]+=x; i+=Lowbit(i); } } int sum(int end) { int sum=0; while(end>0) { sum+=C[end]; end-=Lowbit(end); } return sum; } int main() { while(scanf("%d",&n)&&n) { int i,m=n; memset(C,0,sizeof(C)); while(m--) { int a,b; scanf("%d %d",&a,&b); updata(a,1); updata(b+1,-1); } printf("%d",sum(1)); for(i=2;i<=n;i++) printf(" %d",sum(i)); printf("\n"); } return 0; }线段树解法:用线段树做就很简单啦~(代码有时间再补一下啦)
相关文章推荐
- HDOJ/HDU 1556 Color the ball(树状数组)
- HDOJ1556 Color the ball 【线段树】+【树状数组】+【标记法】
- HDOJ/HDU 1556 Color the ball(树状数组)
- Color the ball HDOJ--1556
- HDOJ-1556 Color the ball
- Color the ball----HDOJ1556
- hdoj 1556 Color the ball
- hdoj 1556 Color the ball 【线段树 + lazy区间更新】 【树状数组】
- HDOJ 1556 Color the ball(线段树 + 线状数组)
- hdoj1556-Color the ball
- HDOJ 1556 Color the ball
- hdoj 1556 Color the ball【线段树区间更新】
- 【HDOJ】1556 Color the ball
- HDOJ 1556 Color the ball(树状数组模板)
- 【HDOJ】1556 Color the ball
- HDOJ 1556 Color the ball (线段树+区间更新)
- HDOJ 1556 Color the ball(树状数组 & 线段树)
- hdoj-1556-Color the ball
- Color the ball----HDOJ1556
- HDOJ 1556 Color the ball(树状数组)