第四次
ARC126
A
写个暴力,造几组小数据,观察规律发现,答案总是形如 $a_1(b_1)a_2(b_2)a_3(b_3)\dots a_{k-1}(b_{k-1})+\{c\}$
(其中 $+$ 表示序列拼接,$b_i$ 表示小于 $a_i$ 且之前没出现过的最小数,$c$ 为之前没出现过的数降序排序的结果)
$a_1(b_1)a_2(b_2)a_3(b_3)\dots a_{k-1}(b_{k-1})$ 中不存在长度 $>k-1$ 的上升子序列,可以保证 $\{a_k\}$ 是答案的 LIS。
B
设 $f_i$ 表示 $[1,i]$ 中以 $a_i$ 结尾的唯一子序列个数,则有 $f_i=\sum\limits_{j\in[p_{a_i},i),j=p_{a_j}}f_j$,其中 $p_j$ 表示 $[1,i]$ 中 $j$ 的最后一次出现位置。
维护 $c_i=\begin{cases}f_i&i=p_{a_i}\\0&i\ne p_{a_i}\end{cases}$,则 $f_i=\sum\limits_{j=p_{a_i}}^{i-1}c_j$。
发现每次转移需要查询 $c_i$ 区间和,然后单点更新 $c_i$,BIT 维护 $c_i$ 即可。
C
特判掉最终 $\gcd>\max\limits_{i=1}^na_i$ 的情况,这部分是平凡的。
倒序枚举最终 $\gcd$ 为 $g\in[1,\max\limits_{i=1}^na_i]$,考虑怎么判断 $\gcd$ 能否取得 $g$。
发现若 $\forall i,g|a_i$ 则 $g=\gcd\limits_{i=1}^na_i$。(反证法:一定有 $g|\gcd\limits_{i=1}^na_i$,而若 $\gcd\limits_{i=1}^n>g$ 则枚举 $g'=\gcd\limits_{i=1}^n$ 时程序已经结束。)
$\forall p,gp\le\max\limits_{i=1}^na_i$ 统计将 $(gp,g(p+1)]$ 间的数都改为 $g(p+1)$ 的代价,开桶容易做到单次 $O(1)$。
若总代价 $\le k$,则 $\gcd$ 可以取得 $g$。复杂度 $O(\sum\limits_{i=1}^W\dfrac Wi)=O(W\log W)$。
D
设最后连续的 $1\dots k$ 为关键点。
可以发现,一定有一种最优解是,先把关键点交换到一起,再把关键点排序。
第一步把关键点交换到一起,对于每个非关键点,都有把其左的关键点移到其右,把其右的关键点移到其左两种方案,则其贡献为其两边关键点数之 $\min$。
第二步把关键点排序,每个关键点的贡献即为其形成的逆序对数,钦定其为值较小的一个。
设 $f_{i,S}$ 为在 $a_{[1,i]}$ 中选定值 $\in S$ 的关键点,$a_{[1,i]}$ 的贡献和最小值。
考虑从 $f_{i-1}$ 转移到 $f_i$,分类讨论 $a_i$ 是否关键点:
- $a_i$ 为关键点,则 $\forall S|a_i\notin S,f_{i,S\cup\{i\}}\gets\min\{f_{i,S\cup\{i\}},f_{i-1,S}+|S\cap(a_i,\infty)|\}$。
- $a_i$ 为非关键点,则 $\forall S,f_{i,S}\gets\min\{f_{i,S},f_{i-1,S}+\min(|S|,k-|S|)\}$。
答案即为 $f_{n,\{x\in\mathbf{N}_+|1\le x\le k\}}$。