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\) 的贡献为
\(\text{dist}(u,r)\) 部分对 \(A\) 的贡献为
\(\text{dist}(v,r)\) 部分对 \(A\) 的贡献为
对 \(B\) 的贡献为
其中 \(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,写了一下午。。。。。吐了