2022.7.27 颓废记录

Luogu7815 「小窝 R3」自傷無色 Present 8.1

给定一棵 \(n\) 个节点的树,边有边权。对于三元组 \((u,v,x)\),称其为「树三角」当且仅当:

  • \(w=\text{LCA}(u,v)\),则 \(w\neq u,w\ne v\),且存在以 \(\text{dist}(u,w),\text{dist}(v,w),x\) 为三边的三角形。

其中 \(\text{dist}(u,v)\) 表示树上两点 \(u,v\) 路径上边权和,\(1\le u,v\le n,x\) 是整数。

对于一个「树三角」\((u,v,x)\),我们认为其权值为 \(\text{dist}(u,w)+\text{dist}(v,w)+x\)(其中 \(w=\text{LCA}(u,v)\))。

\(A\) 为所有「树三角」的权值和,\(B\) 为「树三角」的个数,你需要求出 \(\frac{A}{B}\bmod (10^9+7)\) 的值。

\(1\le n\le 10^5\),边权是 \([1,10^9]\) 中的正整数。

一年之后回来看这题感觉真的好垃圾。。首先显然可以分别算 \(A,B\) 然后求个逆元完事。

我们枚举 \(\text{LCA}\),计算所有 \(\text{LCA}=r\) 的点对 \((u,v)\) 的贡献。

对于两条长为 \(a,b\) 的路径,不妨设 \(a<b\),那么 \(x\in [b-a+1,a+b-1]\)

\(A\) 的贡献是一个等差数列求和,即 \(b\times (2a-1)\),对 \(B\) 的贡献就是 \(2a-1\)

考虑树上启发式合并,对于新的子树中的一个新点 \(u\),设当前点集为 \(S\)\(x\)\(A\) 的贡献为

\[\begin{aligned} &\sum_{v\in S,d_v-d_r\le d_u-d_r}(2\times(d_v-d_r)-1)\times (d_u-d_r)+\sum_{v\in S,d_v-d_r>d_u-d_r}(2(d_u-d_r)-1)\times (d_v-d_r)\\ =&\ \ \ \ \ 2(d_u-d_r)\times\sum_{v\in S,d_v\le d_u}d_v+(-2d_rd_u+2d_r^2-d_u+d_r)\times \sum_{v\in S,d_v\le d_u}1\\&+(2d_u-2d_r-1)\times \sum_{v\in S,d_v> d_u}d_v+(-2d_rd_u+2d_r^2+d_r)\times \sum_{v\in S,d_v>d_u}1 \end{aligned} \]

\(\text{dist}(u,r)\) 部分对 \(A\) 的贡献为

\[\left(\sum_{v\in S,d_v-d_r\le d_u-d_r}2(d_v-d_r)+\sum_{v\in S,d_v-d_r>d_u-d_r}2(d_u-d_r)-|S|\right)\times (d_u-d_r) \]

\(\text{dist}(v,r)\) 部分对 \(A\) 的贡献为

\[\begin{aligned}&\sum_{v\in S,d_v\le d_u}(2(d_v-d_r)-1)\times (d_v-d_r)+\sum_{v\in S,d_v>d_u}(2(d_u-d_r)-1)\times (d_v-d_r)\\ =&\ 2\sum_{v\in S,d_v\le d_u}d_v^2+(-4d_r-1)\times \sum_{v\in S,d_v\le d_u}d_v+(2d_r^2+d_r)\times \sum_{v\in S,d_v\le d_u}1\\ &+(2d_u-2d_r-1)\times \sum_{v\in S,d_v> d_u}d_v+(-2d_rd_u+2d_r^2+d_r)\times \sum_{v\in S,d_v>d_u}1 \end{aligned} \]

\(B\) 的贡献为

\[\begin{aligned} &\sum_{v\in S,d_v-d_r\le d_u-d_r}2(d_v-d_r)+\sum_{v\in S,d_v-d_r>d_u-d_r}2(d_u-d_r)-|S|\\ =&\ \ 2\times\left(\sum_{v\in S,d_v\le d_u}d_v-d_r\times \sum_{v\in S,d_v\le d_u}1+(d_u-d_r)\times \sum_{v\in S,d_v> d_u}1\right)-|S| \end{aligned} \]

其中 \(d_u=\text{dist}(1,u)\)

因此我们要做的就是维护一个集合 \(S\),支持插入一个数以及查询 \(\sum_{x\le k}x\)\(\sum_{x\le k}1\) 之类的东西。

我偷懒直接写了个动态开点权值线段树代替平衡树,复杂度 \(O(n\log n\log V)\)

AC Code,写了一下午。。。。。吐了

posted @ 2022-07-27 22:35  云浅知处  阅读(48)  评论(0编辑  收藏  举报