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\) 爆限制的情况,方案数就简化为:

\[\text{ways}=\binom{n+m-1}{m-1}-\sum_{i=1}^{m}\binom{n-a_i-1+m-1}{m-1} \]

当我们取 \(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\) 即可。

posted @ 2021-11-30 20:39  wlzhouzhuan  阅读(469)  评论(0编辑  收藏  举报