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

 

转载于:https://www.cnblogs.com/astoninfer/p/4791179.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值