zoukankan      html  css  js  c++  java
  • P5332 【[JSOI2019]精准预测】

    每个火星人在每个时刻只有死或者生两种状态,所以我们考虑拆点2-sat。

    对于每个火星人在每个时刻拆成一个点,然后对于连边就按照题目描述模拟。

    如果一个火星 (i)(t) 时刻或者,那么其在 (t-1) 时刻也一定或者。如果其在 (t) 时刻死亡,那么在 (t+1) 时刻也一定死亡。

    这样我们就得到了一个暴力的建图方式,时空复杂度是 (O(nT+m))。无法通过此题。

    考虑有用的时间状态,其实就是所有与 (m) 个条件有关的时间和 (T+1),那么我们就可以把时空复杂度降为 (O(n+m))

    接下来的问题是如何求解答案,我们对于每个火星人求出当其在 (T+1) 时刻活着时,有多少个火星人一定死亡。这个我们可以直接在缩点后的dag上跑有向图连通性(由于会算重不能直接统计个数),用bitset可以在 (O(frac{n^2}{w})) 的时间复杂度内实现。但是空间不太允许,那么我们就把关键点(死亡点)拆成若干份,每份 (D) 个点,这样空间复杂度降为 (O(frac{nD}{w})),时间复杂度为 (O(frac{n^3}{Dw})),当 (D=10^4) 时就可以通过此题。

    注意这题有一个恶心的地方,如果一个点活着可以推出他死了,那么他一定是死的。

    code

  • 相关阅读:
    Python编程知识
    Ubuntu 20.04.3 LTS + Intel Realsense 400系列
    Kubectl
    在Debian Buster中安装redis-cli
    MySQL中最近执行的查询的信息
    EntityFramework 在脚本中使用in
    CLDR TimeZone Mapper
    Skyspark Axon
    Async Restsharp call
    HTTP 1.1 中的Accept-Language header
  • 原文地址:https://www.cnblogs.com/zcr-blog/p/14891119.html
Copyright © 2011-2022 走看看