CF2003
B
给定一个序列,A 和 B 在博弈。
两人每次可以选择相邻的两个位置,A 可以把两个位置变为一个 $\max(a_i,a_{i+1})$,B 可以把两个位置变为一个 $\min(a_i,a_{i+1})$。
博弈进行到只剩一个的时候,此时 A 希望该值最大,B 希望最小。
求最后的博弈结果。
$n\le 10^5$
注意到两人的操作等价于选择两个相邻位置然后删除其中一个的贪心结果,那么也就等价于删除任意一个位置。
于是肯定是一个删小的一个删大的,那么结果就是中位数。
C
给定一个字符串 $s$,定义好数对:
对于一个数对 $(i, j)$(保证 $1 \leq i < j \leq n$),是好数对当且仅当 $s_i=s_j$,或者存在一个 $k$(保证 $i \leq k < j$)满足以下两点:
$s_k \neq s_{k+1}$。
$s_k \neq s_i$ 或 $s_{k+1} \neq s_j$。
现在需要对给定的这个字符串重排,使得好数对数量最多。
给出方案。
$n\le 10^5$
感觉这个好数对的定义很松,考虑什么样的对不是好的。
考虑这样当且仅当 \(s_{i}\neq s_{j}\),且存在一个分割点使得左半边都等于 \(s_{i}\) 右半边都等于 \(s_{j}\)。
也就是说,把串分为若干连续段,则答案为 \(\sum\limits len_{i}\times len_{i+1}\)。
要最小化这个东西,咋做呢?
考虑构造下界是 \(n-1\),朴素的构造是任意两个相邻的都不同。
在存在一个很多的字符时显然不能这么构造,考虑可以利用上述构造,把最多的字符放到最前面,然后然最多和次多交替出现,就可以完成只有两种字符的时候的构造。
多种字符的构造也是对的,因为次多,所以后面部分可以做到相邻不等。
D
[Luogu](https://www.luogu.com.cn/problem/CF2003D2)
给定若干个序列。
你有一个数 x,你可以选择一个序列,然后做 $x\leftarrow mex(x,a_{i,1},\cdots,a_{i,l_i})$。
Easy Version 中,你可以对同一序列做任意次该操作,Hard Version 中同一序列至多操作一次。
设 $f(k)$ 表示通过若干次操作使得 $x=k$ 变成的最大值。
求 $\sum_{i=0}^m f(i)$。
$n\le 10^5,\sum l_i\le 10^5,m,a_i\le 10^9$
思路解析
考虑刻画对一个序列操作后的结果。
建图分析。
实现,考虑一些条件。
正解
对于一个序列操作后的结果是怎样的?
发现若设 \(u=mex(a_{i}),v=mex(u,a_{i})\) 则有 \(u\to v\),或者任意其它值变为 \(u\)。
那么 Easy Version 由于可以操作任意次,那么最大可达值是 \(\max(v_{i})\),只需对该序列操作两次即可取到。
那么对于 \(i>\max(v_{i})\) 就不需要操作了,计算是简单的。
注意到 \(v_{i}\) 是 \(\mathcal O(n)\) 级别的。
考虑 Hard Version,不妨建出 \(u\to v\) 的有向图。
对于一个 \(x\),可以直接走到 \(\max(u_{i})\),或者沿当前链走到最大的 \(v\),或者通过一个出度 \(>1\) 的节点走到最大的 \(v\)。
由于是 DAG,求出 \(f_{u}\) 表示某位置可达的最大点编号,则答案是三者取 \(\max\)。
无论如何,经过操作得到的上界是 \(\max(v_{i})\),对于大于该值不需要操作,对于小于该值直接暴力 \(\mathcal O(1)\) 计算即可。
E
[Luogu](https://www.luogu.com.cn/problem/CF2003E2)
给定 m 个区间,称一个排列合法,当且仅当:
对于每个区间钦定一个 $k_i\in [l_i,r_i)$,记 $a_i=\max_{j=l_i}^{k_i}(p_j),b_i=\max_{j=k_i+1}^{r_i}(p_j)$。
存在一组钦定方案,使得 $\max(a_i)<\min(b_i)$。
若存在排列合法,最大化一个合法排列的逆序对数。
$n,m\le 5000$
Easy Version 中保证区间无交。
合理但并不好跳出来的首步转化。
思路解析
考虑判断,没前途。
考虑到枚举后的判断,转化为 01 序列。
贪心填充,dp 决策。
观察刻画区间交,转化为区间无交。
正解
考虑判定合法排列,贪心并没有好的方案。
考虑枚举 \(\max a_{i}\),那么是可以判断的。
具体方式形如把 \(\leq v\) 的位置染成 0,\(>v\) 的位置染成 1。
合法排列的充要条件就是存在一个 01 序列,使得对于每个区间,0 占一个前缀,1 占一个后缀(前后缀都不可空)。
(本质上我们是从另一个 角度 来考虑该问题)
若能找到这个 01 序列,那么最大化逆序对数是简单的,只需让 0 内和 1 内都自大而小排列即可。
逆序对数形如 \(\binom{cnt_{0}}{2}+\binom{cnt_{1}}{2}+cnt_{1,0}\)。
这等价于最小化 01 顺序对个数。
那么我们可以用一个 dp 来决策,是容易的。
然而若区间有交就不好决策了,我们考虑详细刻画:
考虑有交的两个区间,\((l_{1},r_{1}),(l_{2},r_{2}),l_{1}\le l_{2}\)。
发现此时要求必须有 \(\min(r_{1},r_{2})\) 前是一段 1 的后缀,\(l_{2}\) 后是一段 1 的前缀。
所以可以只保留 \((\max(l_{1},l_{2}),\min(r_{1},r_{2}))\),并钦定其余部分已经有固定的填充物了。
注意到如果有很多个由有交联系起来的区间,则它们必须得有公共交,且长度 \(\geq 2\),否则无解。
如此处理后区间无交,变回 Easy Version。
贪心
试图 \(\mathcal O(n+m)\)。
我们只需做:构造一个 01 序列,要求所有给定区间内都是 0 前缀 1 后缀的形式(且不空),最小化顺序对个数。
注意到区间可以再拆为左右端点钦定选什么,中间任意选。
那么贪心地让中间是同色的更优,对于任意情况调整下来都是。
且有这样的端是单调的,左边全是 1,右边全是 0,且除了区间内外边的也是。
不会严谨证明。
所以扫描线即可。
F
[Luogu](https://www.luogu.com.cn/problem/CF2003F)
给定三个序列,要求选择一个长度为 m 的单调增序列 p,满足:
p 在 a 中生成的子序列单调不降。
p 在 b 中生成的子序列不重。
一个合法的 p 的价值定义为其在 c 中生成的子序列之和。
若存在合法的 p,最大化其价值。
$n\le 3000,m\le 5$
思路解析
没啥前途,只好考虑状压。
如果 b 的值域很小状压即可。
考虑随机化把 b 碰撞到该序列上即可。
正解
限制太多了。
无法建模,但是 m 很小,考虑怎么去状压。(暴搜没前途)
考虑若 b 的值域较小就可以状压值域,设计 dp 是简单的。
那么随机化把 b 映射到一个足够小的值域上即可。
做完了。