GP of Southeastern Europe 2021 & SEERC2021
GP of Southeastern Europe 2021
D. LIS Counting
给定 \(n,m\),以及模数 \(p\)。考虑所有满足 \(LIS=n,LDS=m\) 的排列,定义 \(f(pos,val)\) 表示满足 \(p_{pos}=val\) 的排列个数。
你需要对于 \(1\le pos,val\le nm\) 均求出答案。
\(1\le n\cdot m\le 100,10^8\le p\le 10^9\),\(p\) 为质数。
Solution
考虑一个排列 \(p\),记二元组 \((inc_i,dec_i)\) 表示前缀 \(i\) 的 LIS 和 LDS,我们放置两个杨表 \(A,B\),在 \(A_{inc_i,dec_i}\) 位置插 \(i\),\(B_{inc_i,dec_i}\) 位置插 \(p_i\),最终形成的杨表必定是 \(n\times m\) 的。
容易发现这是双射,即我们固定一组 \(A,B\),一定能得到 \(p\) 且 \(p\) 满足要求。
我们观察 \(A,B\) 杨表的性质。对于 \(A\) 而言,有行列均递增;对于 \(B\) 而言,有行递减,列递增。因此 \(A,B\) 杨表本质相同,下面我们只考虑计数 \(A\)。
我们记 \(A\) 的第 \(i\) 行长度为 \(a_i\),显然有 \(m\ge a_1\ge a_2 \ge \cdots \ a_m\ge 0\),于是 \((a_1,a_2,\cdots,a_m)\) 这个 \(m\) 元组有 \(\binom{n+m}{m}\) 种可能,我们可以爆搜得到杨表的所有形态。
接下来,我们用 \(dp[i][state]\) 表示在杨表里放了 \(1\sim i\),当前杨表的形态是 \(state\) 的方案数,转移是平凡的。
考虑答案怎么求,对于 \(f(pos,val)\) 而言,答案是 \(\sum\limits_{i,j} coef_A[i][j][pos] \times coef_B[i][j][val]\),其中 \(coef\) 数组表示有多少个杨表的 \((i,j)\) 位置等于 \(pos\),该数组是好求的。
总时间复杂度 \(\mathcal O(\binom{n+m}{n} m^2 +(nm)^3)\),在 \(n=12,m=8\) 的时候最卡。
评测记录,这题超级没有素质,连个过的代码都没有。。
I. Colourful Permutation Sorting
给定排列 \(p_1,p_2,\cdots,p_n\),每个位置有一个颜色 \(c_i\),一共有 \(k\) 种颜色。
现在,你可以做任意多次以下两种操作:
- 花费 \(S\) 的代价,交换任意两个数;
- 花费 \(cost_i\) 的代价,随便排列颜色 \(=i\) 的位置的数。
你需要用最小的代价使得排列满足 \(p_i=i\),求代价。
\(1\le n\le 10^5,1\le k\le 5\)。
Solution
首先,我们抽象这个问题:
有 \(n\) 个盒子,第 \(i\) 个盒子编号为 \(i\)。有 \(n\) 个球,第 \(i\) 个球编号为 \(i\)。
初始第 \(i\) 个盒子里放着第 \(p_i\) 个球。
- 1 操作:交换第 \(i\) 个盒子里的球和第 \(j\) 个盒子里的球;
- 2 操作:随便交换颜色 \(=i\) 的盒子。
容易发现 1 操作和 2 操作是独立的,因此我们可以先执行 1 操作,最后再执行 2 操作,并且每种颜色至多进行一次操作 2。
于是我们 \(O(2^k)\) 枚举哪些颜色进行了操作 2,给每个选的颜色开一个点,答案就是 选的颜色代价和 + \(S\times (n-环数)\),我们目标是最大化环数。问题转化为一张 \(5\) 个点的有向图最多能分解成几个环。
我们不妨先去除自环和二元环,因为如果 \(i\to j,j\to i\) 不在一个环里,我们调整它们所在的两个环,答案不劣。
假如图只有 \(4\) 个点,那么由抽屉原理知,总出度 \(\le \binom{4}{2}\),因此必定存在一个点出度为 \(1\),即经过这个点的环必定走这条出边,因此我们直接把该点和出边缩起来,问题降到 \(3\) 个点的子问题。
现在图有 \(5\) 个点,可能会出现一个点的出度 \(=2\),此时它的入度至多为 \(2\)(因为入度 + 出度 + 1 \(\le 5\)),由于总边数是 \(O(n)\) 量级的,我们暴力枚举其中一条出边的访问情况,问题又转化为 \(4\) 个点的子问题。
时间复杂度 \(\mathcal O(2^k (n + \text{poly}(k)))\)。
M. Many LCS
构造两个 01 串 \(S,T\),满足它们的公共子序列数 \(=K\)。
\(1\le K\le 10^9\),你需要满足 \(1\le |S|,|T|\le 8848\)。
时间限制 \(\text{4000ms}\),空间限制 \(\text{256MB}\)。
Solution
一种很新颖的 idea(感谢 @YLWang 的指导):
我们构造 \(S=\underline{00..0}\ 01\ \underline{00..0}\ 01 \cdots \underline{00..0}\ 01\),其中有 \(m\) 段,第 \(i\) 段的 \(00..0\) 个数为 \(a_i\);\(T=01\ 01\ \cdots 01\),其中有 \(n+m\) 个 \(01\)。满足 \(\sum a_i \ge n\)。
我们要让它们的 LIS 做到 \(n+2m\),即 \(S\) 中的 \(01\) 均取,然后每段中取 \(0\le b_i\le a_i\) 个 \(0\),满足 \(\sum b_i=n\)。显然,对于不同的 \(b\) 取法,对应不同的最长 LIS。
对于合法的 \(b\) 序列计数,我们可以考虑容斥哪些 \(b_i> a_i\) 来计算。但为了方便,我们不妨假设 \(a_i>\frac{n}{2}\),这样就不存在至少两个 \(b_i\) 爆限制的情况,方案数就简化为:
当我们取 \(m=4\) 的时候,这里的五个组合数基本上可以遍历 \(0\sim 10^9\) 的所有数。因此我们找到最小的 \(n\) 满足 \(\binom{n+m-1}{m-1}\ge k\),然后用 01 背包找出 \(a_1\sim a_4\) 即可。如果当前 \(n\) 不满足,我们试试看 \(n+1\),依次类推,这里的移动次数极少。
但是存在一个问题:我们需要满足 \(a_i > \frac{n}{2}\),当 \(k\) 较小时 \(n\) 也较小,可能导致构造不出解。
幸运的是,当 \(k\) 较小的时候,我们取 \(m=2\),构造 \(S=\underline{00..0}\ 01\ \underline{00..0}\ 01\),\(T=01\ 01 \cdots 01\),\(S\) 中每段 \(0\) 的个数为 \(k-1\),\(T\) 中的 \(01\) 的个数为 \(k+1\) 即可。