zoukankan      html  css  js  c++  java
  • 【JZOJ3824】【NOIP2014模拟9.9】渴

    SLAF

    世界干涸,Zyh认为这个世界的人们离不开水,于是身为神的他要将他掌控的仅仅两个水源地放置在某两个不同的城市。这个世界的城市因为荒芜,他们仅仅保留了必要的道路,也就是说对于任意两个城市有且仅有一条可行的道路。更简单的,城市形成了一棵树。
    Zyh要将这两个水源放在两个不同的城市。饥渴的人们会选择一个离他们最近的水源,并向其走去。每个城市的人的速度都是相同的,并且两个相邻(有边直接相连)的城市的距离都是1,每个人花费的时间也都是1。zyh想知道对于他的每种放置方案,最迟到达的时间是多少。
    对于100%的数据 n<=200000 , m<=200000

    THISR

    对于询问x,y,如果从xy这条路径上的中点把树一分为二;
    那么x所在的树只受x影响,y所在的树只受y的影响。
    证明的关键:
    由于原图是一棵树,所以xy的路径有且只有一条。


    首先给所有点维护,以其为子树中并且以其出发的最长链、次长链、次次长链的长度。
    现在考虑如何对于一个询问而言,分别给两棵树求出从x,y出发的最长链。
    deep[x]>deep[y]
    那么从x向上跳dist(x,y)2就是路径中点mid
    然后,树就变成了这样。
    这里写图片描述

    1.x
    

    首先对于x而言,现在x的子树中找一条从x出发的最长链。
    再从xmid的路径上找一条从x出发的最长链:
    这个可以使用倍增实现,设g1[i][j]表示,从i点出发,在与其距离为2j的父亲的路径上,不包含i的最长链。
    由于不能包含x的子树,所以要维护最大值,和次大值。

    2.y 
    

    对于y而言也是雷同,在LCA向下到mid时,需要维护另一个倍增数组g2[i][j]
    注意一下:
    1.mid=LCA的情况;
    2.LCA的父亲也可以产生最长链。

    Dance in the Dark

    这方法是真的骚。
    但原题的出题人提供的解法就是维护最长链、次长链、次次长链+倍增的方法,
    而非直径的那种方法。

  • 相关阅读:
    LInux-crontab
    Linux权限-chmod1
    Tool_BurpSuite安装和简单使用
    python与redis交互(四)
    Flask_环境部署(十六)
    Nginx_配置文件nginx.conf配置详解
    Tool_linux环境安装python3和pip
    Nginx_全局命令设置
    Linux_无法解析域名
    VMware_克隆机器后主机Ping不同虚拟机,虚拟机能Ping通主机
  • 原文地址:https://www.cnblogs.com/hiweibolu/p/6714804.html
Copyright © 2011-2022 走看看