第二次 AB
如何评价 CSP 模拟赛两道黑题
A
注意到 $x\in\{a_1\oplus b_i|1\le i\le n\}$,即 $x$ 只可能在这 $n$ 个数中取值。
考虑怎么检查一个数 $p$ 是否是可能的 $x$。若 $\{a_i\oplus p\}$ 可重排为 $\{b_n\}$,则 $p$ 是可能的 $x$。
$O(n)$ 地检查每个 $p\in\{a_1\oplus b_i|1\le i\le n\}$ 是否是可能的 $x$,总复杂度 $O(n^2)$。
B
钦定 $\texttt{R}=0,\texttt{G}=1,\texttt{Y}=2$。
设 $f_{i,j,k,o}$ 表示在答案序列的前 $i+j+k$ 位中填了 $i$ 个 $0$、$j$ 个 $1$、$k$ 个 $2$ 且最后一位为 $o$ 时的最小交换次数。
以填一位 $0$,$f_{i,j,k,o}|o\ne 0$ 转移到 $f_{i+1,j,k,0}$ 为例,考虑增加的交换次数,即新增的一位与原序列上这一位之前的位置产生的逆序对数。
前 $i$ 个 $0$ 都填到了这个 $0$ 的前面,所以这个 $0$ 不会与前面的 $0$ 产生逆序对。
设原序列上,这个 $0$(第 $i+1$ 个 $0$)前有 $p$ 个 $1$。
- 若 $j<p$,则其中 $j$ 个 $1$ 填在这个 $0$ 前面,剩下 $p-j$ 个 $1$ 只能填在这个 $0$ 后面,产生 $p-j$ 个逆序对。
- 若 $j\ge p$,则全部 $p$ 个 $1$ 都填在这个 $0$ 前面,不会产生新的逆序对。
设原序列上,这个 $0$(第 $i+1$ 个 $0$)前有 $q$ 个 $2$。
- 若 $k<q$,则其中 $k$ 个 $2$ 填在这个 $0$ 前面,剩下 $q-k$ 个 $2$ 只能填在这个 $0$ 后面,产生 $q-k$ 个逆序对。
- 若 $k\ge q$,则全部 $q$ 个 $2$ 都填在这个 $0$ 前面,不会产生新的逆序对。
预处理 $w_{i,j}$ 表示第 $j$ 个 $i$ 的位置,$u_{i,j}$ 表示 $a_{[1,i]}$ 中 $j$ 的个数即可 $O(1)$ 转移。
C
一点不会。
D
说一下值域很小的做法吧……
预处理 $p_{j,i}=\min\limits_{\max\limits_{k=i-t}^ia_k\ge j}t$,即 $a_i$ 至少向左取几位最大值才能 $\ge j$,则 $p_{j,i}=\begin{cases}0&j\le a_i\\p_{j,i-1}+1&j>a_i\end{cases}$。
则若 $\max\limits_{j=i-t}^ia_j=k$,则 $\forall w\le k,p_{w,i}\le t$。则 $\sum\limits_{i=l}^r\max\limits_{j=i-t}^ia_j=\sum\limits_{w=1}^W\sum\limits_{i=l}^r[p_{w,i}\le t]$。
证明:若 $\max\limits_{j=i-t}^ia_j=k$,则 $w\le k$ 时内层 $\sum$ 都会统计 $i$ 位置,总共统计 $k$ 次,而 $i$ 位置的贡献 $\max\limits_{j=i-t}^ia_j$ 恰好为 $k$。
主席树维护区间小于等于某数的数的个数,复杂度 $O(nW\log n)$。