Color the ball(線段樹,區間更新)

2021-09-26 23:16:04 字數 1480 閱讀 4071

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

31 1

2 23 3

31 1

1 21 3

0sample output

1 1 1

3 2 1

思路:以氣球的數顏色覆蓋次數建樹,其實建樹的那一步都時省去了。線段樹的區間更新,本題算比較特殊吧,最後要求的輸出的每個氣球上色次數,實質上進行的就是x和y相同的區間查詢。

#include

#include

#define ll long long

#define n 100010

int add[

4*n]

,n,ans;

//ans 用來表示每個氣球的上色次數

void

pushdown

(int k)

}void

update

(int k,

int l,

int r,

int x,

int y)

pushdown

(k);

int mid=l+r>>1;

if(x<=mid)

update

(k<<

1,l,mid,x,y);if

(midupdate

(k<<1|

1,mid+

1,r,x,y);}

void

query

(int k,

int l,

int r,

int x)

pushdown

(k);

int mid=l+r>>1;

if(x<=mid)

query

(k<<

1,l,mid,x)

;else

query

(k<<1|

1,mid+

1,r,x);}

intmain()

for(i=

1;i<=n;i++

)printf

("\n");

}return0;

}

線段樹區間更新 Color the ball

n個氣球排成一排,從左到右依次編號為1,2,3.n.每次給定2個整數a b a b lele便為騎上他的 小飛鴿 牌電動車從氣球a開始到氣球b依次給每個氣球塗一次顏色。但是n次以後lele已經忘記了第i個氣球已經塗過幾次顏色了,你能幫他算出每個氣球被塗過幾次顏色嗎?input 每個測試例項第一行為乙...

樹狀陣列 Color the ball

n個氣球排成一排,從左到右依次編號為1,2,3.n.每次給定2個整數a b a b lele便為騎上他的 小飛鴿 牌電動車從氣球a開始到氣球b依次給每個氣球塗一次顏色。但是n次以後lele已經忘記了第i個氣球已經塗過幾次顏色了,你能幫他算出每個氣球被塗過幾次顏色嗎?input 每個測試例項第一行為乙...

樹狀陣列 Color the ball

n個氣球排成一排,從左到右依次編號為1,2,3.n.每次給定2個整數a b a b lele便為騎上他的 小飛鴿 牌電動車從氣球a開始到氣球b依次給每個氣球塗一次顏色。但是n次以後lele已經忘記了第i個氣球已經塗過幾次顏色了,你能幫他算出每個氣球被塗過幾次顏色嗎?input 每個測試例項第一行為乙...