鏈結
給出一棵nn個結點的樹,有mm
次修改操作, 每次操作要求將a,b
a,b之間最短路徑所有點加上型別為c
c的糧食11次,
到最後輸出每個點所儲存的最多的糧食型別, 如果有相等數量的, 則輸出型別編號最小的.
n,m,c<=1
05n,
m,c<=1
05
整體使用 setset 維護, 會發現由於左兒子對右兒子的影響難以消除, 於是學習了以下方法 ↓
↓
若只維護乙個線性的序列,假如要將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 思路 如題目名稱,模板...