Color the ball
Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 14711 Accepted Submission(s):
7354
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
Recommend
可以使用线段树的方法,也可以不用,如果不用线段树,代码非常巧妙,值得学习。
题意:中文题,很好理解。
附上代码:
1.线段树
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #define M 100006 5 using namespace std; 6 struct node 7 { 8 int l,r; 9 int n; 10 } ss[M*4]; 11 12 void build(int l,int r,int k) 13 { 14 ss[k].l=l; 15 ss[k].r=r; 16 ss[k].n=0; 17 if(l==r) return; 18 int mid=(l+r)/2; 19 build(l,mid,k*2); 20 build(mid+1,r,k*2+1); 21 } 22 23 void add(int l,int r,int k) 24 { 25 if(ss[k].l==l&&ss[k].r==r) 26 { 27 ss[k].n++; 28 return; 29 } 30 int mid=(ss[k].l+ss[k].r)/2; 31 if(r<=mid) add(l,r,2*k); 32 else if(l>mid) add(l,r,2*k+1); 33 else 34 { 35 add(l,mid,2*k); 36 add(mid+1,r,2*k+1); 37 } 38 } 39 40 int ans; 41 void search(int d,int k) 42 { 43 ans+=ss[k].n; 44 if(ss[k].l==ss[k].r&&ss[k].l==d) return; 45 int mid=(ss[k].l+ss[k].r)/2; 46 if(d<=mid) search(d,2*k); 47 else search(d,2*k+1); 48 } 49 50 int main() 51 { 52 int T,i,j,a,b; 53 while(~scanf("%d",&T)&&T) 54 { 55 build(1,T,1); 56 for(i=0; i<T; i++) 57 { 58 scanf("%d%d",&a,&b); 59 add(a,b,1); 60 } 61 for(i=1; i<T; i++) 62 { 63 ans=0; 64 search(i,1); 65 printf("%d ",ans); 66 } 67 ans=0; 68 search(T,1); 69 printf("%d ",ans); 70 } 71 return 0; 72 }
2.非线段树
#include <iostream> #include <cstdio> #include <cstring> #define M 100005 using namespace std; int vis[100005]; int main() { int i,j,n,m,T; while(~scanf("%d",&T)&&T) { memset(vis,0,sizeof(vis)); for(i=0; i<T; i++) { scanf("%d%d",&n,&m); vis[n]++; vis[++m]--; } int s=0; for(i=1; i<=T; i++) { if(i!=1) printf(" "); s+=vis[i]; printf("%d",s); } printf(" "); } return 0; }