P4556 雨天的尾巴 線段樹合併

2021-10-02 17:59:45 字數 3231 閱讀 9720

題目背景

深繪里一直很討厭雨天。

灼熱的天氣穿透了前半個夏天,後來一場大雨和隨之而來的洪水,澆滅了一切。

雖然深繪里家鄉的小村落對洪水有著頑固的抵抗力,但也倒了幾座老房子,幾棵老樹被連根拔起,以及田地裡的糧食被弄得一片狼藉。

無奈的深繪里和村民們只好等待救濟糧來維生。

不過救濟糧的發放方式很特別。

題目描述

首先村落裡的一共有 nnn 座房屋,並形成乙個樹狀結構。然後救濟糧分 mmm 次發放,每次選擇兩個房屋 (x, y)(x,~y)(x, y),然後對於 *** 到 yyy 的路徑上(含 *** 和 yyy)每座房子裡發放一袋 zzz 型別的救濟糧。

然後深繪里想知道,當所有的救濟糧發放完畢後,每座房子裡存放的最多的是哪種救濟糧。

輸入格式

輸入的第一行是兩個用空格隔開的正整數,分別代表房屋的個數 nnn 和救濟糧發放的次數 mmm。

第 222 到 第 nnn 行,每行有兩個用空格隔開的整數 a, ba,~ba, b,代表存在一條連線房屋 aaa 和 bbb 的邊。

第 (n+1)(n + 1)(n+1) 到第 (n+m)(n + m)(n+m) 行,每行有三個用空格隔開的整數 x, y, zx,~y,~zx, y, z,代表一次救濟糧的發放是從 *** 到 yyy 路徑上的每棟房子發放了一袋 zzz 型別的救濟糧。

輸出格式

輸出 nnn 行,每行乙個整數,第 iii 行的整數代表 iii 號房屋存放最多的救濟糧的種類,如果有多種救濟糧都是存放最多的,輸出種類編號最小的一種。

如果某座房屋沒有救濟糧,則輸出 000。

輸入 #1

5 3

1 23 1

3 45 3

2 3 3

1 5 2

3 3 3

輸出 #1

233

02

最後dfs的時候,只需要將2個點的線段樹進行合併。 這樣裡面的每類的最大就合併到乙個點裡面去了。

;//cnt是動態開點的個數 rt代表每個節點的線段樹根節點編號

void

add(

int u,

int v)

void

bfs()}

}int

lca(

int x,

int y)

if(x == y)

return x;

for(

int k = lg; k >=

0; k--

)return f[x][0

];}void

pushup

(int id)

void

update

(int

&id,

int l,

int r,

int x,

int c)

int mid =

(l + r)

>>1;

if(x <= mid)

update

(tr[id]

.lc, l, mid, x, c)

;else

update

(tr[id]

.rc, mid +

1, r, x, c)

;pushup

(id);}

intmerge

(int p,

int q,

int l,

int r)

int mid =

(l + r)

>>1;

tr[p]

.lc =

merge

(tr[p]

.lc, tr[q]

.lc, l, mid)

; tr[p]

.rc =

merge

(tr[p]

.rc, tr[q]

.rc, mid +

1, r)

;pushup

(p);

return p;

}void

dfs(

int u,

int fa)

ans[u]

= tr[rt[u]

].mx ==0?

0: tr[rt[u]

].id;

}int

main()

bfs();

for(

int i =

1; i <= m; i++

)//對z進行離散化

sort

(idz +

1, idz +

1+ m)

; cntz =

unique

(idz +

1, idz +

1+ m)

- idz -1;

for(

int i =

1; i <= m; i++

)dfs(1

,0);

for(

int i =

1; i <= n; i++

)printf

("%d\n"

, idz[ans[i]])

;return0;

}

P4556 雨天的尾巴

題目背景 深繪里一直很討厭雨天。灼熱的天氣穿透了前半個夏天,後來一場大雨和隨之而來的洪水,澆滅了一切。雖然深繪里家鄉的小村落對洪水有著頑固的抵抗力,但也倒了幾座老房子,幾棵老樹被連根拔起,以及田地裡的糧食被弄得一片狼藉。無奈的深繪里和村民們只好等待救濟糧來維生。不過救濟糧的發放方式很特別。題目描述 ...

洛谷P4556 雨天的尾巴

p4556 vani有約會 雨天的尾巴 模板 線段樹合併 題目大意 有一顆 n 個節點的樹,m 次操作,每次將節點 u 到 v 的路徑上的每個點放乙個物品 c 最後詢問每個節點上數量最多的物品是什麼,其中數量相同的物品取編號最小者,若無物品輸出0。n,m,c leq 10 5 思路 如題目名稱,模板...

P4556 線段樹合併,差分

線段樹合併 差分 對於每次修改操作 u,v u,v u,v 我們給u,v u,vu,v節點打上 1 1 1的標記,給lca u,v lca u,v lca u,v f l ca u v f lca u,v f lca u,v 打上 1的標記 最後計算答案的時候,dfs dfsdf s一遍,將子樹內的...