CF1178G The Awesomest Vertex Solution
给定一棵n个点的树T,每个点的权值为二元组aibi定义Ru为u的所有祖先节点(包括u)的集合.定义u的权值为Wui∈Ru∑ai×i∈Ru∑bi你需要执行q1 u xau←aux2 ui∈subtreeumaxWi。
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)