zoukankan      html  css  js  c++  java
  • CF1601B

    题目大意

    有一只青蛙在 (n),在点 (i) 可以向上跳最多 (a[i]) 的距离,跳完之后若在 (j) 点,当前位置则会变为 (j+b[j])

    这个做法是 xmz 教给我的

    题解

    显然可以转化为一个图论问题,然后区间加边求单源最短路,需要 DS 优化建图。

    但这个东西比较复杂,这里介绍一种简单的图论做法。

    我们考虑我们上述问题的复杂度瓶颈是什么,就是在每个点都会扫一遍全部出边,这很有可能让复杂度退化到 (O(n^2))。但考虑到这些点中有一些是我们已经扫过的,显然再遍历一遍肯定不如上一次的答案优秀,如果能够去掉这些点复杂度就能降下来。

    观察可得,已经扫过的点肯定是呈现为一个区间,所以我们可以借用树上冰茶姬覆盖的想法来维护这个东西。

    具体来说每个点维护一个冰茶姬,当扫过 (i) 点之后,就将它的前驱 (i+1) 和自己 (unite) 起来,这样就可以很方便的维护出下一个未覆盖的点是谁。

    我自己实现的时候冰茶姬似乎只能路径压缩,不能按秩合并。所以复杂度也只能做到 (O(nlog n))

    代码

  • 相关阅读:
    内存分配小问题
    从MACHINE_START开始
    Linux驱动学习(二)
    9,斐波那契数列 6,旋转数组找最小 8青蛙跳台阶 JAVA实现
    数组练习题
    类的练习
    for循环练习题
    封装练习题
    Facebook成为Apache基金会的白金赞助商
    Visual Studio 2010
  • 原文地址:https://www.cnblogs.com/-Iris-/p/15480995.html
Copyright © 2011-2022 走看看