HDOJ 1556 Color the ball(线段树 + 线状数组)
2017-04-03 21:09
288 查看
Color the ball[b]Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 19051 Accepted Submission(s): 9517 [/b] Problem Description[align=left]N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的“小飞鸽"牌电动车从气球a开始到气球b依次给每个气球涂一次颜色。但是N次以后lele已经忘记了第I个气球已经涂过几次颜色了,你能帮他算出每个气球被涂过几次颜色吗?[/align][align=left] [/align] [align=left] [/align] Input每个测试实例第一行为一个整数N,(N <= 100000).接下来的N行,每行包括2个整数a b(1 <= a <= b <= N)。当N = 0,输入结束。 [align=left] [/align] [align=left] [/align] Output[align=left]每个测试实例输出一行,包括N个整数,第I个数代表第I个气球总共被涂色的次数。[/align][align=left] [/align] [align=left] [/align] Sample Input31 1 2 2 3 3 3 1 1 1 2 1 3 0 [align=left] [/align] Sample Output1 1 13 2 1 |
法一:线段树
#include <bits/stdc++.h> using namespace std; #define mst(a,b) memset((a),(b),sizeof(a)) #define f(i,a,b) for(int i=(a);i<(b);++i) const int maxn =100005; const int mod = 10005; const int INF = 1e9; #define ll long long #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define rush() int T;scanf("%d",&T);while(T--) int tree[maxn<<2]; int output[maxn]; int cnt; void pushdown(int rt) { tree[rt<<1]+=tree[rt]; tree[rt<<1|1]+=tree[rt]; } void build(int l,int r,int rt) { if(l==r) { tree[rt]=0; return; } int m=(l+r)>>1; build(lson); build(rson); } void update(int L,int R,int l,int r,int rt) { if(L<=l&&r<=R) { tree[rt]++; return; } int m=(l+r)>>1; if(L<=m) { update(L,R,lson); } if(m<R) { update(L,R,rson); } } void push(int l,int r,int rt) { if(l==r) { output[cnt++]=tree[rt]; return; } int m=(l+r)>>1; pushdown(rt); push(lson); push(rson); } int main() { int n; while(~scanf("%d",&n)&&n) { mst(tree,0); //build(1,n,1); int a,b; f(i,0,n) { scanf("%d%d",&a,&b); update(a,b,1,n,1); } cnt=0; push(1,n,1); f(i,0,cnt-1) { printf("%d ",output[i]); } printf("%d\n",output[cnt-1]); } return 0; }
法二:线状数组
#include <bits/stdc++.h> using namespace std; #define mst(a,b) memset((a),(b),sizeof(a)) #define f(i,a,b) for(int i=(a);i<(b);++i) const int maxn =100005; const int mod = 10005; const int INF = 1e9; #define ll long long #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define rush() int T;scanf("%d",&T);while(T--) int n,tree[maxn]; int lowbit(int x) { return (x&(-x)); } int sum(int x) { int ans=0; while(x>0) { ans+=tree[x]; x-=lowbit(x); } return ans; } void add(int x,int num) { while(x<=n) { tree[x]+=num; x+=lowbit(x); } } int main() { int a,b; while(~scanf("%d",&n)&&n) { mst(tree,0); f(i,0,n) { scanf("%d%d",&a,&b); add(a,1); add(b+1,-1); } f(i,1,n) printf("%d ",sum(i)); printf("%d\n",sum(n)); } return 0; }
相关文章推荐
- HDOJ1556 Color the ball 【线段树】+【树状数组】+【标记法】
- HDOJ 1556 Color the ball(树状数组 & 线段树)
- hdoj 1556 Color the ball 【线段树 + lazy区间更新】 【树状数组】
- HDU 1556 Color the ball 很典型的更新区间查找点的题(线段树树状数组两种解法)
- HDOJ 1556 Color the ball(树状数组)
- HDOJ/HDU 1556 Color the ball(树状数组)
- hdoj 1556 Color the ball(树状数组)
- hdoj 1556 Color the ball【线段树区间更新】
- hdu 1556 Color the ball(线段树 or 树状数组 or 前缀和)
- hdoj--1556--Color the ball(模拟&&树状数组)
- HDOJ/HDU 1556 Color the ball(树状数组)
- HDU - 1556 Color the ball(树状数组 or 线段树)
- hdoj--1556--Color the ball(模拟&&树状数组)
- hdu 1556 Color the ball (树状数组||线段树成段更新)
- hdoj 1556 Color the ball 【线段树】
- HDU 1556 Color the ball【线段树区间更新,一次查询+数组模拟】
- HDOJ 1156 - Color the ball 水题复习线段树..线段树与树状数组的对比..
- HDU 1556 Color the ball【线段树及lazy思想】【树状数组】
- HDoj-1556-Color the ball-树状数组
- [HDOJ 1556] Color the ball(线段树成段更新入门)