hdu1556 D - Color the ball

題目:

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
樹狀數組的區間更新單點查詢.當給區間(l,r)的氣球染色時可以將l後面的所有數+1將r+1後面的所有數-1,這樣當你想要但點查詢時x點直接query(x)得到前x的和就是x這個點被染色的次數.

代碼:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<bitset>
#include<cstdlib>
#include<cmath>
#include<set>
#include<list>
#include<deque>
#include<map>
#include<queue>
using namespace std;
typedef long long ll;
const double PI = acos(-1.0);
const double eps = 1e-6;
const int INF = 1000000000;
const int maxn = 123467;
int T,n,m;
int ball[maxn];

int lowbit(int x)
{
    return x&(-x);
}

int query_sum(int x)
{
    int sum=0;
    while(x>0)
    {
        sum+=ball[x];
        x-=lowbit(x);
    }
    return sum;
}

void update(int x, int v)
{
    while(x<=n)
    {
        ball[x]+=v;
        x+=lowbit(x);
    }
}

int main()
{
    while(scanf("%d",&n)&&n)
    {
        memset(ball,0,sizeof(ball));
        for(int i=0;i<n;i++)
        {
            int a,b;
            scanf("%d%d",&a,&b);
            update(a,1);
            update(b+1,-1);
            for(int i=1;i<=2*n;i++)
                printf("%d\t",ball[i]);
        }
        printf("%d",query_sum(1));
        for(int i=2;i<=n;i++)
        {
            printf(" %d",query_sum(i));
        }
        printf("\n");
    }
    return 0;
}


發佈了90 篇原創文章 · 獲贊 3 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章