每个火星人在每个时刻只有死或者生两种状态,所以我们考虑拆点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) 时就可以通过此题。
注意这题有一个恶心的地方,如果一个点活着可以推出他死了,那么他一定是死的。