zoukankan      html  css  js  c++  java
  • NOI2018情报中心

    题意

    给定(n)个点的带边权树,(m)条代价路径,令两条路径((u_1,v_1,w_1)(u_)(u_2,v_2,w_2))(val=sumlimits_{(u,v)in dis(u_1,v_1)~or~(u,v)in dis(u_2,v_2)}val(u,v)-w_1-w_2)。求(max_{i,j,i eq j}{val_{i,j}})

    做法

    (x)到根的边权和为(len_x)

    lca不同

    令黄色链,长度为(len_1),代价为(val_1),lca为(lca_1)。蓝色:(len_2,val_2,lca_2)
    令红色点为(x)
    (val=len_1+len_2-len(x)+max(len(lca_1),len(lca_2))-val_1-val_2)

    考虑对每个点(x),线段树维护
    (f_i):路径一端在(x)子树,链的lca的深度为(i),链长度-代价的最大值
    (g_i):路径一端在(x)子树,链的lca的深度为(i),链长度-代价+(len_{lca})的最大值

    可以线段树合并维护。值得注意的细节是,处理完x的子树后,将([dep_x-1,n])清空

    答案的更新可以通过:(fa_x=y),将(y)合并给(x)时左子树右子树这样更新一下

    lca相同

    枚举lca,建虚树
    (val=)(路径长度和+蓝点间路径+绿点路径)/2-代价
    枚举蓝点的lca,令蓝点为(a,b),对应的绿点分别为(p_a,p_b)
    相当于最大化:(dis(p_a,p_b)+dis(a,p_a)+dis(b,p_b)-2cost(a,p_a)-2cost(b,p_b)+len(a)+len(b)-2len(lca))
    发现除去(dis(p_a,p_b)),其他的都是独立的
    由于枚举了(lca),则无需管(2len(lca))。对绿点下面新建一个叶子节点,其边权为上述需要维护的。
    不过边权可能为负,不过由于是叶子节点,新加入点作为端点的最长路径另一端点必定为原直径端点依然成立

  • 相关阅读:
    LeetCode 128. 最长连续序列
    MySQL的information_schema
    maven项目板块的pom.xml配置
    mybatis打印SQL日志
    MySQL的时间字段转换
    mysql的csv数据导入与导出
    一致性协议
    分布式事务
    事务基本信息
    分布式系统定义及特点
  • 原文地址:https://www.cnblogs.com/Grice/p/12900542.html
Copyright © 2011-2022 走看看