zoukankan      html  css  js  c++  java
  • hdu5420 Victor and Proposition

    官方题解:

    这是一道图论题。其中,命题与命题之间的关系我们可以看成边,如果A命题是B命题的充分条件,那么我们就可以从A向B连一条有向边,同理,如果B是A的充分条件,那么就从B向A连一条有向边。那么如果两个命题i,j互为充要条件,那么i和j就会属于同一个强连通分量,所以,这道题就变成了求强连通分量的题目。强连通分量有两种求法,分别是Kosaraju算法和Tarjan算法,在这里我就不详细介绍了。这道题的关键实际上在于建图。

    首先,题中给出了一个以1号结点为根的树形结构,我们在构图的过程中,要将结点i和以xi为根的子树中与xi深度差不超过di的结点连一条有向边。但是,结点最多有十万个,如果直接连的话肯定是会超时的,所以需要一些黑科技进行优化。我们要用线段树来优化建图。对于每个结点,我们都需要用一棵线段树来维护其子树中深度为i的结点有哪些,那么,连边的时候,我们只需要将结点i往xi的线段树中,dep[x_i]到dep[x_i]+d_i的范围内的所有结点连一条边即可,既然已经建了线段树,如果线段树上每个结点往其子节点都连一条边,那么我们只要将结点i与对应线段树中[dep[x_i],dep[x_i]+d_i]范围内的结点连一条边。但是这样一来,建图的速度反而变慢了,没有关系,我们可以进行线段树合并。首先,遍历整个树,对于树上的叶子结点,我们都建立一棵线段树,之后,在返回的过程中,每个结点对应的线段树都是其所有子结点线段树合并的结果,这样一来,建图的复杂度就变成O(nlogn)了。

    http://acm.hdu.edu.cn/showproblem.php?pid=5420

  • 相关阅读:
    ExtJs学习笔记之ComboBox组件
    ExtJs学习笔记之学习小结LoginDemo
    ExtJs学习笔记之Button组件
    ExtJs学习笔记之TextField
    WAF指纹识别和XSS过滤器绕过技巧
    python中的迭代与递归
    使用Python对文档单词进行计数
    Python正则表达式使用实例
    Python十六进制与字符串的转换
    数组名a,数组名取地址&a,数组首地址&a[0],数组指针*p
  • 原文地址:https://www.cnblogs.com/astoninfer/p/4791179.html
Copyright © 2011-2022 走看看