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)= iR(u)ai × iR(u)bi

你需要执行 q q q 个操作,分两种:

  • 1 u x:执行 a u ← a u + x a_u\gets a_u+x auau+x.
  • 2 u:求 max ⁡ i ∈ subtree ⁡ ( u ) W ( i ) \max\limits_{i\in \operatorname{subtree}(u)} W(i) isubtree(u)maxW(i).

Limitations

1 ≤ n ≤ 2 × 10 5 1\le n\le 2\times 10^5 1n2×105
1 ≤ q ≤ 10 5 1\le q\le 10^5 1q105
∣ a i ∣ , ∣ b i ∣ ≤ 5000 |a_i|,|b_i|\le 5000 ai,bi5000
1 ≤ x ≤ 5000 1\le x\le 5000 1x5000

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)=iR(u)ai,Q(u)=iR(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)| maxP(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),但是卡不满,可以过.

Submission

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐