zoukankan      html  css  js  c++  java
  • 懒癌

    • 题目链接

      uoj#76

    • 题目大意

      \(n\) 个人,每个人都有一种状态 \(0\)\(1\) ,如果一个人在某天知道自己的状态为 \(1\) ,那么会在当天开枪自杀。

      每个人能知道其余若干人的状态,这构成一个有向图。

      人与人不会相互交流,所有人都知道这 \(n\) 个人中至少有一个人状态为 \(1\)

      一旦有人自杀则立即停止。

      求:对于所有 \(2^n-1\) 种可能状态,开枪时间和以及自杀人数和(同一天自杀算多个人),对 \(998244353\) 取模。

      \(n\le 3000\)

    • 题解

      首先考虑完全图。

      不难归纳证明出有 \(k\) 个人为 \(1\) 就是第 \(k\) 天,死 \(k\) 个人。

      我们考虑 \(dp\)

      然后考虑一个人的推理过程:肯定是先假设自己为 \(0\) ,然后对于所有的可能状态 \(S\)\(\max\{f_S\}+1\) 就是自己的开枪时间。

      那么我们可以枚举所有状态 \(S\) ,对于其中每一个状态为 \(1\)\(i\) ,有一个他能看到的状态 \(T\) ,再枚举他看不到的所有可能状态 \(X\) ,那么 \(t_i=\max\{f_{T\cup X}\}+1\) ,所以 \(f_S=\min\{t_i|i\in S\}\)

      考虑在 \(DAG\) 上转移,我们发现如果一个状态能结束当且仅当转移无环。对于一个人 \(i\in S\) ,转移相当于把自己变为 \(0\) ,将无出边的人变为 \(1\) 。那么我们考虑在补图上做这个事情。

      根据转移无环,那么我们将所以指向强联通分量的删去,就会得到一个 \(DAG\) (补图意义下)。

      接下来我们证明一个结论:

      一个状态 \(S\)\(f_S\) 为在这个 \(DAG\)\(S\) 中的点直接或间接能到达的点的个数。

      考虑按拓扑序从大到小归纳。

      对于一个空集,显然成立。

      那么考虑状态 \(S\) 的任意一个点 \(i\) ,我们将 \(i\) 变为 \(0\) 使得 \(i\) 所指的点变为 \(1\) ,那么由归纳假设知 \(t_i\) 为这个新状态 \(T\)\(f_T+1\) 。所以所有的 \(i\in S\)\(t_i\) 均满足这个结论,所以结论对于 \(S\) 成立。证毕。

      所以就是对于一个 \(DAG\) 求所有状态能到达的点的数量,随便怎么做都行。

  • 相关阅读:
    loj2042 「CQOI2016」不同的最小割
    loj2035 「SDOI2016」征途
    luogu2120 [ZJOI2007]仓库建设
    luogu3195 [HNOI2008]玩具装箱TOY
    51nod 1069 Nim游戏 + BZOJ 1022: [SHOI2008]小约翰的游戏John(Nim游戏和Anti-Nim游戏)
    HDU 5723 Abandoned country(最小生成树+边两边点数)
    BZOJ 1497: [NOI2006]最大获利(最大权闭合图)
    51nod 1615 跳跃的杰克
    SPOJ 839 Optimal Marks(最小割的应用)
    UVa 11107 生命的形式(不小于k个字符串中的最长子串)
  • 原文地址:https://www.cnblogs.com/leukocyte/p/14546310.html
Copyright © 2011-2022 走看看