CF1178G The Awesomest Vertex Solution
Description
给定一棵
n
n
n 个点的树
T
T
T,每个点的权值为二元组
(
a
i
,
b
i
)
(a_i,b_i)
(ai,bi).
定义
R
(
u
)
R(u)
R(u) 为
u
u
u 的所有祖先节点(包括
u
u
u)的集合.
定义
u
u
u 的权值为
W
(
u
)
=
∣
∑
i
∈
R
(
u
)
a
i
∣
×
∣
∑
i
∈
R
(
u
)
b
i
∣
W(u)=\bigg|\sum_{i\in R(u)} a_i\bigg|\times\bigg|\sum_{i\in R(u)} b_i\bigg|
W(u)=
i∈R(u)∑ai
×
i∈R(u)∑bi
你需要执行 q q q 个操作,分两种:
1 u x:执行 a u ← a u + x a_u\gets a_u+x au←au+x.2 u:求 max i ∈ subtree ( u ) W ( i ) \max\limits_{i\in \operatorname{subtree}(u)} W(i) i∈subtree(u)maxW(i).
Limitations
1
≤
n
≤
2
×
10
5
1\le n\le 2\times 10^5
1≤n≤2×105
1
≤
q
≤
10
5
1\le q\le 10^5
1≤q≤105
∣
a
i
∣
,
∣
b
i
∣
≤
5000
|a_i|,|b_i|\le 5000
∣ai∣,∣bi∣≤5000
1
≤
x
≤
5000
1\le x\le 5000
1≤x≤5000
Solution
记
P
(
u
)
=
∑
i
∈
R
(
u
)
a
i
,
Q
(
u
)
=
∑
i
∈
R
(
u
)
b
i
P(u)=\sum\limits_{i\in R(u)} a_i,Q(u)=\sum\limits_{i\in R(u)} b_i
P(u)=i∈R(u)∑ai,Q(u)=i∈R(u)∑bi.
首先这个
Q
(
u
)
Q(u)
Q(u) 是假的,由于只会修改
a
a
a,所以
W
(
u
)
W(u)
W(u) 可以视作关于
∣
P
(
u
)
∣
|P(u)|
∣P(u)∣ 的一次函数.
考虑直接维护
P
(
u
)
P(u)
P(u) 和
Q
(
u
)
Q(u)
Q(u),那么对
a
a
a 的单点加相当于对
P
(
u
)
P(u)
P(u) 的子树加,直接拍到 dfs 序上.
现在问题转化为给
P
(
u
)
P(u)
P(u) 区间加,查询区间
max
∣
P
(
u
)
∣
×
∣
Q
(
u
)
∣
\max |P(u)|\times|Q(u)|
max∣P(u)∣×∣Q(u)∣.
注意到
∣
x
∣
=
max
(
x
,
−
x
)
|x|=\max(x,-x)
∣x∣=max(x,−x),由于只会加正数,可以用两棵 KTT 维护函数
y
=
P
(
u
)
×
∣
Q
(
u
)
∣
y=P(u)\times|Q(u)|
y=P(u)×∣Q(u)∣ 和
y
=
−
P
(
u
)
×
∣
Q
(
u
)
∣
y=-P(u)\times|Q(u)|
y=−P(u)×∣Q(u)∣,查询时对两个
y
y
y 取最大的即可.
时间复杂度约为 O ( ( n + q ) log 3 n ) O((n+q)\log^3 n) O((n+q)log3n),但是卡不满,可以过.
更多推荐


所有评论(0)