首页 > 学院 > 开发设计 > 正文

hdu 1556 Color the ball (线段树+代码详解)

2019-11-06 07:04:46
字体:
来源:转载
供稿:网友

Color the ball

Time Limit: 9000/3000 MS (java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 18696    Accepted Submission(s): 9328PRoblem DescriptionN个气球排成一排,从左到右依次编号为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
31 12 23 331 11 21 30 Sample Output
1 1 13 2 1 

一开始写这个题的时候我是用了线段树,但是a了之后看其他大牛的博客,发现了另一种思路,并且时间空间都要比线段树少很多,那么现在就来归纳一下这两种方法。

方法1:

#include<stdio.h>struct data{	int l,r,v;}line[400005];void bulid (int l,int r,int x)		//构建二叉树; {	line[x].l=l;	line[x].r=r;	line[x].v=0;					//这里需要讲所有节点标记为零; 	if(l==r){		return ;	}	int m=(r+l)/2;	bulid(l,m,x*2);	bulid(m+1,r,x*2+1);}void updata (int l, int r ,int x , int a , int b )	//更新二叉树; {	if(l<=a&&b<=r){					//如果节点x在l和r区间范围之内,则这个区间标记的值加1; 		line[x].v++;		return ;	}	int m=(a+b)/2;	if(m<l){						//这里需要注意符号 		updata(l,r,x*2+1,m+1,b);	}else if(r<=m){		updata(l,r,x*2,a,m);	}else {		updata(l,m,x*2,a,m);		updata(m+1,r,x*2+1,m+1,b);	}}int query (int i,int x,int l,int r,int sum)	//查询,其中sum记录涂颜色的次数; {	if(i==l&&i==r){		return sum+line[x].v;	}	int m=(l+r)/2;	sum+=line[x].v;	if(i<=m){		return query(i,x*2,l,m,sum);	}else {		return query(i,x*2+1,m+1,r,sum);	}}int main (){	int i,j,n,m,a,b;	while(scanf("%d",&n),n!=0){		bulid(1,n,1);		for(i=0;i<n;i++){			scanf("%d %d", &a, &b);			updata(a,b,1,1,n);		}		for(i=1;i<=n;i++){			if(i==1)				printf("%d",query(i,1,1,n,0));			else printf(" %d",query(i,1,1,n,0));		}		printf("/n");	}	return 0;}方法二:

#include<stdio.h>#include<string.h>int main (){	int line[100010];	int n,a,b,i,sum;	while(scanf("%d",&n),n){		memset(line,0,sizeof(line));		for(i=0;i<n;i++){			scanf("%d %d",&a,&b);			line[a]++;			line[++b]--;		}		sum=0;		for(i=1;i<=n;i++){			sum+=line[i];			if(i==1)				printf("%d",sum);			else printf(" %d",sum);		}		printf("/n");	}	return 0;}


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表