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): 15491    Accepted Submission(s): 7731
Problem Description
N 개의 풍선 이 한 줄 로 늘 어서 있 습 니 다. 왼쪽 에서 오른쪽으로 번호 가 1, 2, 3 입 니 다.
 
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:   1542  1394  1698  1255  2795
제목 은 간단 하지만 데이터 양 이 적은 편 이 아니 라 직접 폭력 은 시간 을 초과 하기 때문에 트 리 배열 을 고려 하고 있다.
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>

using namespace std;
const int MAXN=100005;
int n;
int c[MAXN];

int lowbit(int x)
{
    return x&(-x);
}
void update(int i,int x)
{
    while(i)
    {
        c[i]+=x;
        i-=lowbit(i);
    }
}

int sum(int i)
{
    int res=0;
    while(i<=n)
    {
        res+=c[i];
        i+=lowbit(i);
    }
    return res;
}
int main()
{
    int a,b;
    while(scanf("%d",&n),n)
    {
        memset(c,0,sizeof(c));
        for(int i=1; i<=n; i++)
        {
            scanf("%d%d",&a,&b);//c[a]~c[b]   1
            update(a-1,-1);//c[a]      1
            update(b,1);//c[b]      1
        }
        for(int i=1; i<n; i++)//  1-N
            printf("%d ",sum(i));
        printf("%d",sum(n));
        printf("
"); } return 0; }

 폭력 시간 초과 코드 도 첨부:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>

using namespace std;
const int maxn=100005;
int s[maxn];

int main()
{
    int a,b,n;
    while(scanf("%d",&n),n)
    {
        memset(s,0,sizeof(s));
        for(int i=1; i<=n; i++)
        {
            scanf("%d%d",&a,&b);
            for(int j=a; j<=b; ++j)
                ++s[j];
        }
        for(int i=1; i<n; i++)
            printf("%d ",s[i]);
        printf("%d",s[n]);
        printf("
"); } return 0; }

좋은 웹페이지 즐겨찾기