zoukankan      html  css  js  c++  java
  • sol

    [例题]巡逻

    注意到K只能是1或2,也就是说只能建0/1/2条新道路

    我们分类讨论

    当修建0条新道路的时候,

    执行遍历会恰好遍历到每条边2次,答案为2*(n-1)

    当修建1条新道路的时候,

    我们设新道路连接x,y,则本来需要走两次的边(x,y)只要走一次,得到结果是2*(n-1)-(x,y),

    易得(x,y)取直径L1时值最小,为2*(n-1)-L1+1

    当修建2条新道路的时候,

    就相当于在修建一条新道路的基础上在修建1条新道路

    如果新道路形成的环有一部分与旧道路形成的环重叠,

    那么我们必须再次经过这些边

    否则答案继续减小

    我们把原直径上的边权取反,然后再次求直径L2,答案就是2*(n-1)-L1+1-L2+1

    [例题]树网的核 BZOJ1999加强版

    转自《算法竞赛进阶指南》

    解法1:暴力

    直接找出直径后枚举左右端点,O(n3)

    解法2:暴力的优化!QAQ

    直接枚举左端点,让右端点最远,O(n2),可轻松AC原题

    解法3:二分

    为了通过加强版,我们继续观察:发现本题答案具有单调性,珂以二分答案

    那么问题就转化为“验证是否存在一个核的偏心距不超过mid”

    珂以找距直径两端点距离分别小于等于mid的两个点作为树网的核

    珂以O(N)判定是否超过S ;

    解法4:分析性质

    设直径上的点为u1,u2......ut,先把这些节点标记为已访问,通过深度优先遍历求出d[ui]表示不经过直径上的点能到达的最远点的距离

    以ui,uj为端点的点的树网的核的偏心距为max(max{d{uk|i≤k≤j},dist(u1,ui) ,dist(uj,ut)) ;

    此时单调队列维护d[uk]就珂以做到O(N)了!

    Warning!

    本文由 TYQ 创作,采用 知识共享署名 4.0 国际许可协议进行许可。
    转载要与作者联系,并需在正文明显处署名作者且注明文章出处。
    对了,我永远喜欢C++啊。

  • 相关阅读:
    form表单生成的简单理解
    drupal里面的ajax最粗浅的理解-流程
    #array_parents #parents的区别
    hook_schema 小总结
    多语言的sitemap xml
    做百度竞价的步骤 不断总结
    为什么要baidu/Google问题 尽量少在群里问问题
    JavaScript Window对象
    JavaScript 3种内置对象
    图片轮播
  • 原文地址:https://www.cnblogs.com/tyqtyq/p/9769811.html
Copyright © 2011-2022 走看看