首页 > 代码库 > 线段树(求单结点) hdu 1556 Color the ball
线段树(求单结点) hdu 1556 Color the ball
Color the ball
Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 22122 Accepted Submission(s): 10715
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,输入结束。
当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
Author
8600
Source
HDU 2006-12 Programming Contest
这道题目是每次每个点加一,不是区间问题
#include<stdio.h> #include<string.h> #include<algorithm> #include<iostream> #define ls (u<<1) #define rs (u<<1|1) using namespace std; int ans[1000000],n; struct node{ int l,r,n; } node[1000000]; void build(int u,int l,int r){ node[u].l = l; node[u].r = r; node[u].n = 0; if(l!=r){ int mid = (l+r)>>1; build(ls,l,mid); build(rs,mid+1,r); } } void update(int u,int x,int y){ if(node[u].l == x && node[u].r == y)//找到要刷的气球区间,更新其被刷的次数+1 node[u].n++; else{ int mid = (node[u].l+node[u].r)>>1; if(y<=mid) update(ls,x,y); else if(x>mid) update(rs,x,y); else{ update(ls,x,mid); update(rs,mid+1,y); } } } void query(int u){ for(int i = node[u].l; i<=node[u].r; i++)//该区间所有编号都被刷了一次 ans[i]+=node[u].n;//求单结点 if(node[u].l == node[u].r) return; query(ls); query(rs); } int main(){ int x,y; while(cin >> n,n){ build(1,1,n); for(int i = 1; i<=n; i++){ cin >> x >> y; update(1,x,y); } memset(ans,0,sizeof(ans)); query(1); cout << ans[1]; for(int i = 2; i<=n; i++) cout << " " << ans[i]; cout << endl; } return 0; }
线段树(求单结点) hdu 1556 Color the ball
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。