1. 程式人生 > >【hdu1556】Color the ball——樹狀數組

【hdu1556】Color the ball——樹狀數組

can n) 實現 分享 ... 2個 tput ring font

Problem 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 這道題就是區間修改,單點查詢,很容易想到用線段樹來做,但是代碼量會很大(懶),所我們可以稍稍變動一下樹狀數組來做這道題~ 我們把左端點+1,右端點的下一位-1。這樣的話位於左右端點之間的前綴和就+1。於是我們就巧妙地把查詢單點改為了求和啦! 具體實現細節看代碼: 技術分享
#include<cstdio>
#include<cstring>
using namespace std;
int n,l,r,c[100010];
int lowbit(int
k){return k&-k;} void add(int x,int val) { while(x<=n) { c[x]+=val; x+=lowbit(x); } } int sum(int x) { int s=0; while(x) { s+=c[x]; x-=lowbit(x); } return s; } int main() { scanf("%d",&n); while(n) { memset(c,
0,sizeof(c)); for(int i=1;i<=n;i++) { scanf("%d %d",&l,&r); add(l,1);add(r+1,-1); } for(int i=1;i<n;i++) printf("%d ",sum(i)); printf("%d\n",sum(n)); scanf("%d",&n); } return 0; }
hdu1556

【hdu1556】Color the ball——樹狀數組