• [cf1349e]Slime and Hats


    • 题目链接

      cf1349e

    • 题目大意

      (n) 个人坐成一列,每个人都戴了一顶或黑或白的帽子,记为序列 ({c_n}) ,其中黑为 (1) 白为 (0)

      一旦有人知道自己帽子的颜色,他将离开。

      对于任意一个人 (i),他能看到前方所有人的帽子颜色,并知道自己后方有多少人离开。

      每一轮所有人将知道一个信息,表示剩下的人中,有没有戴黑帽子的。

      同时每个人都必须在每一轮知道信息后就决定自己离不离开,也就是说如果一个人通过这一轮其他人的离开推断出自己的帽子颜色,他必须在下一轮离开。

      假设所有人都足够聪明,这样每个人都有一个离开的时间 (t_i)

      现在要求:给序列 ({t_n}) ,还原任意一个可能的 ({c_n})

      (nle 2 imes10^5,0le t_ile 10^{15})(t_i=0) 表示无限制。

    • 题解

      显然,我们首先考虑有 ({c_n}) ,如何得到 ({t_n})

      先定义序列 ({b_n}) ,满足:

      • (forall c_i=1,b_i=i)
      • (forall c_i=0,b_i=min{j|j> i and c_j=1})

      我们在序列末尾放一个黑帽子,这样就能满足所有 (b_i) 都存在。

      那么通过一点逻辑推理可得:

      • (c_i=1)(t_i=sum_{jle i and c_j=1}n-j+1)
      • (c_i=0)(t_i=t_{b_i}+1)

      接着我们可以发现,(forall i<j)(t_i)(t_j) 的关系可以分为:

      1. (t_i=t_j+1 iff (forall ile k<j,c_k=0) and c_j=1)
      2. (t_i=t_j iff (forall ile kle j, c_k=0)or(exist i<k<j, c_k=1and forall ile tle n, t eq k, c_t=0))
      3. (t_i<t_j otherwise)

      因此,我们可以根据给定的 ({t_n}) ,将序列合并成若干区间([l_i,r_i]) (不妨设有 (m) 个),满足:

      1. (forall t_i eq 0, exist! 1le jle m, iin [l_j,r_j])
      2. (forall 1le ile m, exist jin [l_i,r_i], t_j eq 0)
      3. (forall i<j (t_i eq 0and t_j eq 0),spaceexist! 1le kle m, i,jin [l_k,r_k]iff t_ige t_j)

      那么除了最后一个区间,这些区间拥有一些良好的性质,具体来说,对于区间 ([l_i,r_i]) ,有:

      • (c_{l_i}=c_{l_i+1}=dots=c_{r_i-1}=0)
      • (b_{l_i}=b_{l_i+1}=dots=b_{r_i-1}=b_{r_i}),记为 (B_i)

      那么我们可以对这些区间 (dp) ,设 (f_{i,j}) 表示区间 (i)(c_{r_i}=j) 时,(B_i) 的最小值。

      接下来考虑从 (f_{i-1,j'}) 转移到 (f_{i,j})

      我们枚举所有可能的 (f_{i,j}) ,那么转移需要满足的条件为:

      [t_{f_{i,j}}=sum_{kle f_{i,j}}n-k+1=t_{f_{i-1}{j'}}+f_{i,j}+sum_{f_{i-1}{j'}<k<f_{i,j}}n-k+1 ]

      那么我们只需要检查是否可以从区间 ([L,R]) 中选出若干个数,使得它们的和为 (S)

      有一个做法是二分选出的数的个数 (num) ,那么在区间 ([sum_{i=L}^{L+num-1}i,sum_{i=R-num+1}^Ri]) 的数都能表示。

      那么我们就可以做到 (mathcal O(log n)) 的转移,这个复杂度是 (mathcal O(nlog n))

      虽然最后一个区间不满足这个性质,但是其中最多只有一个 (1) ,直接暴力枚举这个 (1) 的位置即可转移。

      总复杂度 (mathcal O(nlog n))

  • 相关阅读:
    20191318实验四 《Python程序设计》实验报告
    20191318实验三 Socket编程技术
    20191318实验二 Python程序设计入门
    实验一 Python程序设计入门
    《信息安全专业导论》第十二周学习总结
    《信息安全专业导论》第十一周学习总结
    markdown画思维导图
    markdown页面内跳转
    20191206 2019-2020-2 《Python程序设计》实验四报告
    20191206 实验三《Python程序设计》实验报告
  • 原文地址:https://www.cnblogs.com/leukocyte/p/14546466.html
Copyright © 2020-2023  润新知