zoukankan      html  css  js  c++  java
  • P3530

    啥?pigeon ycx 又回来补差分约束了?有生之年。


    Portal

    这是一个挺厉害的差分约束。

    首先建出差分约束系统。然后它要你求的是不同成绩的最大数量,而差分约束只擅长做「两个变量的差的最大 / 小值」这种问题,如何转化过去呢?

    注意到对于任意差分约束系统,这个点与点的连通性是非常混乱的,无法判断点和点和点和点之间到底能不能拉开,还是必须重叠的什么情况。我们考虑一个强连通图,这里面每个点到每个点都可以互相到达,也就是说任意两个变量的差都有有限的上下限。那就很好了呀,我们至少知道了它的不同成绩的数量的一个上限:我们总要选两个点当作值域的两端对不对,而每两个点的差都是有有限上限的,于是取那个最大的距离(也就是最大的一对点之间的最短路)就是上限了。接下来考虑上限能不能达到,很容易证明可以,因为在那条最大的最短路上,一路走的过程中每次加一,都一定是第一种限制做的功劳,而第一种限制是定量限制,限制死了的,所以一旦把值域的两端确定下来,中间都填的满满的。

    至此我们已经知道一个强连通图的求法了。考虑将原图强连通分解,然后每个 SCC 求出来答案,再缩点发现是个 DAG。DAG 也是个连通性特殊的有向图,它也好办了呀,没有任意两个 SCC 间有相互的限制,也就是说我们可以沿着边的方向将两个 SCC 之间的距离无限拉大,这样每个 SCC 就是独立的了,把所有 SCC 答案加起来也就达到了上限。

    然后考虑实现?强连通分解用 Tarjan,然后最短路的话因为 (n) 只有 (600) 可以 Floyd 三行搞定(包括判负环)(不过要开 O2)。

    code

    珍爱生命,远离抄袭!
  • 相关阅读:
    关于使用JavaMail注册激活邮箱的注意点
    Maven Web报错:org.apache.jasper.JasperException: Unable to compile class for JSP
    IDEA的中文乱码问题
    深入了解Java动态代理与反射机制
    String、StringBuffer和StringBuilder的区别
    Java中HashCode()和equals()的关系
    Java中向下转型的意义
    局部内部类访问局部变量的问题
    Java内部类的应用场景
    Python os.rmdir() 方法
  • 原文地址:https://www.cnblogs.com/ycx-akioi/p/solution-p3530.html
Copyright © 2011-2022 走看看