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): 12814    Accepted Submission(s): 6401
Problem Description
N 개의 풍선 이 한 줄 로 늘 어서 고 왼쪽 에서 오른쪽으로 순서대로 번호 가 1,2,3 이다.그런데 N 번 이후로 릴 은 I 번 째 풍선 이 몇 번 이나 발 랐 는 지 잊 어 버 렸 어 요.풍선 마다 몇 번 발 랐 는 지 계산 해 주 시 겠 어 요?
 
Input
각 테스트 실례 의 첫 번 째 행 위 는 정수 N,(N<=100000)입 니 다.다음 N 줄 은 정수 a b(1<=a<=b<=n)2 개 를 포함 합 니 다.
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
 
Recommend
LL   |   We have carefully selected several similar problems for you:   1166  1542  1394  1698  1255 
 
Statistic |  Submit |  Discuss |  Note
라인 트 리 구간 업데이트 문제그냥 쓰 면 돼.
매번 업데이트 할 때마다 시간 을 절약 하기 위해 업데이트 가 필요 한 구간+1 만 있 으 면 됩 니 다.
#include <stdio.h>
#include <string.h>
struct node
{
	int left,right,count;
}c[100005*3];
int sum[100005];
void build(int l,int r,int root)//       
{
	c[root].left=l;
	c[root].right=r;
	c[root].count=0;
	if(l==r)
	return ;
	int mid=(l+r)/2;
	build(l,mid,root*2);
	build(mid+1,r,root*2+1);
}
void update(int l,int r,int root)//  
{
	if(c[root].left==l&&c[root].right==r)//        +1   ,    ,       
	{
		c[root].count++;
		return ;
	}
	int mid=(c[root].left+c[root].right)/2;
	if(mid<l)
	update(l,r,root*2+1);
	else if(mid>=r)
	update(l,r,root*2);
	else
	{
		update(l,mid,root*2);
		update(mid+1,r,root*2+1);
	}
}
void tosum(int root)//  
{
	for(int i=c[root].left;i<=c[root].right;i++)
	sum[i]+=c[root].count;
	if(c[root].left==c[root].right)
	return ;
	tosum(root*2);
	tosum(root*2+1);
}
int main()
{
	int n;
	while(scanf("%d",&n)&&n)
	{
		memset(sum,0,sizeof(sum));
		memset(&c,0,sizeof(&c));
		build(1,n,1);
		for(int i=0;i<n;i++)
		{
			int l,r;
			scanf("%d %d",&l,&r);
			update(l,r,1);
		}
		tosum(1);
		printf("%d",sum[1]);
		for(int i=2;i<=n;i++)
		printf(" %d",sum[i]);
		printf("
"); } return 0; }

좋은 웹페이지 즐겨찾기