点差分
对于一组方向
(
s
,
t
)
(s,t)
(s,t) 点差分操作为:
d
s
←
ds \leftarrow
ds←
d
s
+
k
ds+k
ds+k;
d
t
←
dt \leftarrow
dt←
d
t
+
k
dt+k
dt+k;
d
l
c
a
←
d_{lca} \leftarrow
dlca←
d
l
c
a
−
k
d_{lca}-k
dlca−k;
d
f
a
(
l
c
a
)
←
d_{fa(lca)} \leftarrow
dfa(lca)←
d
f
a
(
l
c
a
)
−
k
d_{fa(lca)}-k
dfa(lca)−k;
其中
k
k
k 为 该变量;
边差分
同一位差分;
\\差分模板
void dfs(int u,int fath){
for \\ 前向行遍历
{
int v = e[i].to;
if(v != fath){
dfs(v,u);
chg[u] += chg[v]; // 注意是 u + v;
}
}
}
int main()
{
`````;
int lca = getlca(s,t);
chg[s]++,chg[t]++ , chg[lca]-=2; // 边差分;
chg[s]++,chg[t]++ , chg[lca]--,chg[fa[lca][0]]--; // 点差分;
}