P4556 雨天的尾巴 樹上差分, 樹鏈剖分

2022-05-20 06:42:18 字數 2939 閱讀 3061

鏈結

給出一棵n

n個結點的樹,有mm

次修改操作, 每次操作要求將a,b

a,b之間最短路徑所有點加上型別為c

c的糧食11次,

到最後輸出每個點所儲存的最多的糧食型別, 如果有相等數量的, 則輸出型別編號最小的.

n,m

,c<=1

05n,

m,c<=1

05

整體使用 set

set 維護, 會發現由於左兒子對右兒子的影響難以消除, 於是學習了以下方法 ↓

若只維護乙個線性的序列,

假如要將a,b

a,b之間加c

c型別1

1個, 即為a

a位置c

c種類加1

1, b+1

b+1位置c

c種類減11,

對每個位置開動態陣列記錄 差分操作, 最後遍歷時用 權值線段樹 維護出現次數最多的型別即可

當其放在了 樹 上時, 可以對 a,b

a,b 使用樹剖中的 mod

ifym

odif

y 與 vec

torv

ecto

r 標記差分操作

可以發現很神奇的一點是:

由於每條重鏈上的編號是連續的, 這樣相當於將一次修改操作變為log

nlog

n個分段修改操作, 可以使得dfn

dfn陣列變得像線性序列一樣可以一遍遍歷得到答案

於是最後從dfs

dfs序為1

1開始遍歷, 權值線段樹掃一遍即可

複雜度 o(m

∗log

2n+n

∗log

2c)o

(m∗l

og2n

+n∗l

og2c

)即 o(n

∗log

2n)o

(n∗l

og2n

)

#include

#define reg register

#define pb push_back

const

int maxn =

100005

;int

read()

while

(isdigit

(c)) s = s*

10+ c-

'0', c =

getchar()

;return s * flag;

}int n;

int m;

int num0;

int lim;

int tim;

int mp[maxn]

;int dfn[maxn]

;int top[maxn]

;int max_son[maxn]

;int dep[maxn]

;int fa[maxn]

;int head[maxn]

;int size[maxn]

;int ans[maxn]

;std::vector <

int> que[maxn]

;struct node t[maxn <<2]

;struct edge edge[maxn <<1]

;void

add(

int from,

int to)

; head[from]

= num0;

}void

dfs_1

(int k,

int fa)

}void

dfs_2

(int k,

int top)

for(reg int i = head[k]

; i; i = edge[i]

.nxt)

}void

modify

(int x,

int y,

int w)

if(dep[x]

< dep[y]

) std::

swap

(x, y)

; que[dfn[y]].

pb(w)

, que[dfn[x]+1

].pb(

-w);

}void

build

(int k,

int l,

int r)

void

push_up

(int k)

void

modify_2

(int v,

int opt,

int k)

int mid = l+r >>1;

if(v <= mid)

modify_2

(v, opt, k<<1)

;else

modify_2

(v, opt, k<<1|

1);push_up

(k);

}int

main()

dfs_1(1

,0),

dfs_2(1

,1);

for(reg int i =

1; i <= m; i ++

)build(1

,1, lim)

;for

(reg int i =

1; i <= n; i ++

)for

(reg int i =

1; i <= n; i ++

)printf

("%d\n"

, ans[i]);

return0;

}

P4556 雨天的尾巴

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

P4556 雨天的尾巴 線段樹合併

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

洛谷P4556 雨天的尾巴

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