[cf1349e]Slime and Hats
-
题目链接
-
题目大意
有 \(n\) 个人坐成一列,每个人都戴了一顶或黑或白的帽子,记为序列 \(\{c_n\}\) ,其中黑为 \(1\) 白为 \(0\) 。
一旦有人知道自己帽子的颜色,他将离开。
对于任意一个人 \(i\),他能看到前方所有人的帽子颜色,并知道自己后方有多少人离开。
每一轮所有人将知道一个信息,表示剩下的人中,有没有戴黑帽子的。
同时每个人都必须在每一轮知道信息后就决定自己离不离开,也就是说如果一个人通过这一轮其他人的离开推断出自己的帽子颜色,他必须在下一轮离开。
假设所有人都足够聪明,这样每个人都有一个离开的时间 \(t_i\) 。
现在要求:给序列 \(\{t_n\}\) ,还原任意一个可能的 \(\{c_n\}\) 。
\(n\le 2\times10^5,0\le t_i\le 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_{j\le i \and c_j=1}n-j+1\)
- 若 \(c_i=0\) ,\(t_i=t_{b_i}+1\)
接着我们可以发现,\(\forall\ i<j\) ,\(t_i\) 与 \(t_j\) 的关系可以分为:
- \(t_i=t_j+1 \iff (\forall\ i\le k<j,c_k=0) \and c_j=1\)
- \(t_i=t_j \iff (\forall\ i\le k\le j,\ c_k=0)\or(\exist\ i<k<j,\ c_k=1\and \forall i\le t\le n, t\neq k,\ c_t=0)\)
- \(t_i<t_j\ \ otherwise\)
因此,我们可以根据给定的 \(\{t_n\}\) ,将序列合并成若干区间\([l_i,r_i]\) (不妨设有 \(m\) 个),满足:
- \(\forall\ t_i\neq 0,\ \exist!\ 1\le j\le m,\ i\in [l_j,r_j]\)
- \(\forall\ 1\le i\le m,\ \exist\ j\in [l_i,r_i],\ t_j\neq 0\)
- \(\forall\ i<j\ (t_i\neq 0\and t_j\neq 0),\space\exist!\ 1\le k\le m,\ i,j\in [l_k,r_k]\iff t_i\ge 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_{k\le 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(n\log n)\) 。
虽然最后一个区间不满足这个性质,但是其中最多只有一个 \(1\) ,直接暴力枚举这个 \(1\) 的位置即可转移。
总复杂度 \(\mathcal O(n\log n)\) 。