HDU 1556樹狀數組求解

F - Color the ball
Time Limit:3000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u

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,輸入結束。
 

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

題意:中文的 ,就不多說了

  現在我們模擬氣球的狀態

  當a= 3,b=7時:

  1  2  3 4  5  6 7  8 9               N

  O O O O O O O O O .............O

          1  0  0 0  0 -1         (分別是data[3]到data[8]的值)第i個珠子被染色的次數是sum[i]即i的前綴和,故只對a,b-1操作即可

現給出AC代碼

#include<cstdio>
#include<string.h>
using namespace std;
int N,a,b,M;
const int MAX=100000+10;
int data[MAX];
int s[MAX];
int lowbit(int i)
{
    return i&(-i);
}
void modify(int x,int delta)
{
    for(int i = x; i <= M; i+=lowbit(i))
    {
        data[i] += delta;
    }
}
int sum(int x)
{
    int ans = 0;
    for(int i = x; i > 0; i-=lowbit(i))
    {
        ans +=data[i];
    }
    return ans;
}
int main()
{
    while(scanf("%d",&N)&&N)
    {
        M=N;
        memset(data,0,sizeof(data));
        while(N--)
        {
            scanf("%d%d",&a,&b);
            modify(a,1);
            modify(b+1,-1);
        }
        for(int i = 1; i < M; i++)
        {
            printf("%d ",sum(i));
        }
        printf("%d\n",sum(M));
    }
    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章