zoukankan      html  css  js  c++  java
  • 【BZOJ】3091: 城市旅行 Link-Cut Tree

    【题意】参考PoPoQQQ

    给定一棵树,每个点有一个点权,提供四种操作:

    1.删除两点之间的连边 不存在边则无视

    2.在两点之前连接一条边 两点已经联通则无视

    3.在两点之间的路径上所有点的点权加上一个数 两点不连通则无视

    4.询问两点之间路径上任选两点路径上的点权和的期望值

    【算法】Link-Cut Tree

    【题解】第四步操作相当于路径所有区间点权和/区间总数。

    假设链有n个点,区间总数就是n*(n+1)/2。假设点权分别为a1~an,则:

    $$ans=sum_{i=1}^{n}a_i*i*(n-i)$$

    考虑在Link-Cut Tree上维护左右信息的合并,假设左区间有n个数,右区间有m个数,则合并后左区间贡献变化:

    $$sum_{i=1}^{n}a_i*i*(n-i) ightarrow sum_{i=1}^{n}a_i*i*(n-i+m+1)$$

    右区间从右往左编号也有此结论,所以对每个点维护lsum=Σa[i]*i,rsum和ans,转移时:

    $$ans_{rt}=ans_l+ans_r+lsum_l*(sz_r+1)+rsum_r*(sz_l+1)+num_{rt}*(sz_l+1)*(sz_r+1)$$

    最后考虑区间加值,lsum和rsum都是加等差数列,而ans需要加Σi*(n-i)=n(n+1)(n+2)/6,拆分两步就可以推出来了。

    复杂度O(n log n)。

  • 相关阅读:
    正则表达式
    Newtonsoft.Json
    MVC之参数验证(三)
    MVC之参数验证(二)
    MVC之参数验证(一)
    MVC之模型绑定
    导致存储过程重新编译的原因
    IFormattable,ICustomFormatter, IFormatProvider接口
    oracle将id串转换为名字串
    oracle查看表空间大小及使用情况
  • 原文地址:https://www.cnblogs.com/onioncyc/p/8688875.html
Copyright © 2011-2022 走看看