OceanEye's Blog

很多人即使只见过一面,已经算见过了最后一面。

51nod 1681 主席树

这题主席树的处理还是有点神的,,
maya我直接抄题解就好了,,反正我方法的和题解是一样的。
但是我比好多人都慢啊QAQ不服气

首先转化问题。两棵树的公共祖先,很扯淡。计算出每两个点的两棵树上的公共祖先我用的复杂度是n^2·logn
妈呀根本不能接受,妥妥的TLE
那么我们计算祖先的贡献怎么样?
首先假设某个点有x个公共儿子,那么他对总的亲密度的贡献是x*(x-1)/2【自己脑补组合数】
但是看一眼数据范围,首先O(n)应该是不可能的了。那么我们能不能在nlogn的时间内瞎搞出所有节点的公共儿子呢qwq
平衡树?搞毛,,线段树?搞毛,,树剖?不好意思不会,,主席树?于是又神奇的想到了转化问题

他的标号是混乱的,这很不清真,,换成DFS序怎么样?
第二棵树呢?还是混乱的,,

混乱又怎么样,,再标一次就好了。这个时候我们要的就是完成两个集合求交集的工作。
那么主席树出场了!

第一棵树的节点先按照dfs序重新编号,记节点A的子节点为l到r
然后第二棵树也这么做,,记节点A的子节点为L到R
这个时候,会惊奇发现他们的公共儿子【交集】不就是求[L,R]中有多少个元素属于[l,r]的么,,
由于这个东西目测满足区间加法,所以主席树应该是可行的。
那么就主席树瞎搞一下,,A掉。
爽!