2021.11.12 模拟赛题解
T1
首先发现我们按照如下方式构造可以较为高效利用给定的格子数构造出尽可能多的 xyr
:
xxxxxxxxxxxxxxxx
yyyyyyyyyyyyyyyy
rrrrrrrrrrrrrrrr
yyyyyyyyyyyyyyyy
xxxxxxxxxxxxxxxx
yyyyyyyyyyyyyyyy
rrrrrrrrrrrrrrrr
...
具体来说如果我们每一行都恰好填上 \(40\) 个同种字符,那么抛开第一行不谈,剩余部分每多两行就会多出 \(116\) 个 xyr
,而由于矩阵大小的限制是 \(40\),稍微算一下即可发现按照上面的方式最多可以造出来 \(\lfloor\dfrac{40-1}{2}\rfloor·116=2204\) 个 xyr
,欸,这离 \(2222\) 的限制差了那么一丢丢,但别忘了造出 \(2204\) 个 xyr
我们只用了 \(39\) 行,也就是说我们还有一行能够填下更多的 xyr
,加上最后一行的差不多刚好 \(2222\) 了罢,八九不离十了。
因此我们考虑用上面的方式不断构造出 \(116\) 个 xyr
直到剩余还需要构造的 xyr
的数量 \(<116\),考虑如何构造剩余的部分,这里我分了两种情况讨论,可能还有更简便的方式,不过 T1 过拍就没管了(
- 如果目前填下的行数 \(<39\),那么我们新建一行 \(40\) 个
y
,再新建一行并计算出在每个位置填上对应字符能够新增多少个xyr
,如果小于当前还需要的xyr
的个数就填,否则填上y
,这样到最后还剩 \(0\sim 2\) 个xyr
,再新建一行带走即可。 - 如果目前填下的行数已经达到了 \(39\),则意味着我们需用一行搞定剩余的若干个
xyr
,那么我们考虑这样填:xyryxyryx...
,不难发现这样一行最多可以创造 \(19\) 个xyr
,略大于 \(2222\) 与 \(2204\) 的差 \(18\),故我们的构造是 ok 的。
T2
首先假设 A 选择第 \(i\) 个教室的概率为 \(p_i\),考虑如何对一组固定的 \(\{p_i\}\) 计算 B 能够抓到打游戏的学生期望最大值,容易发现,第 \(i\) 个教室剩余的打游戏的学生个数的期望值为 \(a_i(1-p_i)\),而老师肯定会选择期望剩余的学生个数最大的教室最优,因此对于一组固定的 \(\{p_i\}\),老师期望能抓到打游戏学生个数的最大值就是 \(\max\{a_i(1-p_i)\}\)。
知道了这个性质之后又该如何计算答案呢?感性地理解一下,由于学生肯定会选最优策略,因此它肯定会选择让 \(\max\{a_i(1-p_i)\}\) 最小的 \(p_i\),这个直接二分答案即可。时间复杂度 \(n\log a_i\)。
所以说这个 \(n\le 30,a_i\le 40\) 是出题人故意迷惑你往奇怪的方向思考的(大雾
T3
经典划分数 DP 题(?)
首先考虑一个排列的本质:对于一个排列,它形成的过程可以想象成一个依次往序列中插入 \(1,2,3,\cdots,n\) 的过程,因此我们考虑用这样的思想去解决这道题。我们从小到大加入 \(1,2,3,\cdots,n\) 并考虑动态地维护一个 \(01\) 序列,其中 \(1\) 代表这个位置已经有值了,\(0\) 代表这个位置还是空着的,那么每次加入一个数,等价于将其中一个 \(0\) 变成 \(1\)。如果我们计算出加入 \(i\) 时将 \(0\) 变成 \(1\) 这个过程前后,\(01\) 序列所有 \(0\) 的连续段的长度的最大值——不妨称改变前为 \(pmx\),改变后为 \(cmx\),那么应有 \(F(cmx+1)=F(cmx+2)=\cdots=F(pmx)=i\),因此我们考虑以此为状态设计 DP。记 \(dp_{i,S}\) 表示目前加入了 \(1\sim i\),目前所有 \(0\) 的连续段的长度组成的集合为 \(S\),有多少个符合条件的序列,转移则等价于将 \(S\) 中某一个元素 \(x\) 切成大小为 \(l\) 和 \(x-1-l\) 的两部分,在转移的过程中判一下合法性即可。注意到我们是不关心 \(S\) 中元素具体排列顺序是怎样的,我们只用关心 \(S\) 中有哪些数,因此总状态数是划分数级别的,再加上转移的复杂度,总复杂度 \(p(n)·n^2\log n\),其中 \(p(n)\) 表示 \(n\) 的划分数。由于跑不满可以通过。
所以说,下次见到 \(n\le 30,n\le 50\) 这种数据范围不要再拘泥地想 polylog 了,说不定你写个暴搜加点剪枝可以证明复杂度与划分数有关,也可以通过/ts
T4
一开始看到这题就觉得这题是个 2-SAT,但是以什么为 01 状态进行 2-SAT 却思考错了,因为我发现 AB 是对称的,因此我尝试对每个位置分是 A/B 和不是 A/B 进行 2-SAT,就导致我陷入的歧途
这个填字母的过程看起来有些难受,考虑进行一些转化。我们不妨用两个 \(01\) 变量 \(a_i,b_i\) 量化每个字母,如果 \(s_i=\text{A}\),那么 \(a_i=1,b_i=0\),如果 \(s_i=\text{B}\),那么 \(a_i=0,b_i=1\),如果 \(s_i=\text{C}\),那么 \(a_i=b_i=1\),如果 \(s_i=\text{D}\) 那么 \(a_i=b_i=0\),那么不难发现,两个点 \(i,j\) 之间的字母属于题目中给的 \(7\) 种字母组合,当且仅当 \((a_i\land\lnot a_j)\lor(b_i\land\lnot b_j)\)。
这样一来我们不妨将题目给的条件翻译成逻辑表达式的语言:如果两点 \(i,j\) 之间有一条权值为 \(1\) 的边那么 \((a_i\land\lnot a_j)\lor(b_i\land\lnot b_j)\),如果它们之间有一条权值为 \(0\) 的边那么 \((\lnot a_i\lor a_j)\land(\lnot b_i\lor b_j)\)。后一个表达式已经可以写成 2-SAT 的形式了,但是前者还不能,因此考虑对其进行转化,不难发现,表达式 \((a\land b)\lor(c\land d)\) 为真当且仅当 \(a,b\) 全为真或 \(c,d\) 全为真,而这又可以写成 \((a\lor c)\land(b\lor c)\land(a\lor d)\land(b\lor d)\),这样就可以写成 2-SAT 的形式了,建个图跑一下即可。
时间复杂度 \(\Theta(n+m)\),常数略有点大。
总结
T1 标签 constructive algorithms,碰到这样的题,一般可以先考虑什么情况下填字母可以尽可能高效地利用空间,从而发现符合要求地构造,并对其进行调整达到题目的要求。
T2 标签 binary search,碰到这样看似无法下手,暴力也不知道怎么打的题,可以先考虑从极端情况入手,即先考虑一个弱化版的问题,对着这个弱化版进行一些推导从而找到通解。
T3 标签 brute force, dp,这道题告诉我们碰到 \(n\le 50\) 或类似数据范围的题,有时即便我们想不出来 polylog 的做法,想到一个要将集合放入状态的 DP,但是这个集合的和是定值,并且我们不考虑这个集合中元素的相对位置关系,我们就可以想到用划分数搞。
T4 标签 graphs,碰到这样没法用纯构造解,但要你输出方案(一般基于图论)的构造题,可以想到 2-SAT(譬如 ztr 的互测题)