ARC068D 题解

ARC068D 题解

这篇题解补充了 Dilworth 定理的证明(实际上是其简化版的证明,因为这道题里只用了该定理的简化版),

以及对这种特殊的计数类型题目的一些总结。

首先看到题中的计数方式套了两层,一般且形式化的讲,就是我们定义两个函数 \(f\)\(g\)

其中 \(f\) 的定义域是一种被称作 'N1' 类型的量,其值域是关于一种被称作 'N2' 类型量的不可重集,

\(g\) 的定义域是 'N2' 类型的量,而其值域是关于一种被称作 'N3' 类型的量的不可重集,

而我们要求的,就是在给定一个 N1 类型量 \(X\) 后,集合 \(S=\bigcup\limits_{\forall u\in f(X)}g(u)\) 的大小。

考虑这种类型问题的一个一般的处理方式,即我们统计所有满足以下条件的 N3 类型量的数量:

对于一个 N3 类型变量 \(u\),称 \(u\) 满足条件,当且仅当存在 N2 类型量 \(v\),使 \(u\in g(v)\)

称满足以上条件的 \(u\) 叫合法,则我们考虑在本题中,

所有合法的 N2(在本题中即为将 \([1,n]\cap \text{Z}^+\) 中的数顺序插入双端队列后形成的排列)量的性质,

\(u\) 必然由三个不交子序列 \(a,b,c\) 构成,且 \(1\)\(u\) 的第 \(k\) 个元素,且 \(a,b,c\) 还满足以下条件:

\(a,b\) 中元素单降,\(c\) 为由单增序列构成的双端队列,\(c\) 中最大元素小于 \(a\) 中最小元素,\(b\) 中最小元素是 \(1\)

其中,\(c\) 为由单增序列构成的双端队列的含义,指 \(c\) 在塞入双端队列时在元素 \(1\) 的右边,

而将元素从双端队列中取出时,\(c\) 中的所有元素在元素 \(1\) 被取出之后,每次从队列的左或右边任挑一边被取出。

发现 \(c\) 的无序性导致了计数的困难,我们考虑能不能为 \(c\) 确定顺序以方便计数。

实际上是可以的,因为我们发现,如果我们强制 \(c\) 中元素在 \(u\) 中单降,

就等价于强制在从队列中取出 \(c\) 的元素时,每次只能从一个固定且不变的方向取;

而我们如果算出了强制了 \(c\) 的顺序后的答案 \(ans\),则最终答案就等于 \(ans\times2^{\max(0,n-k-1)}\)

原因是,存在于 \(ans\) 中的任意两种方案的不同之处都不在 \(c\) 的元素顺序。

故此时我们可以将 \(c\)\(a\) 拼接在一起,那原问题就等价于对满足以下条件,且 \(p_k=1\) 的排列 \(p\) 计数:

我们称 \(p\) 满足条件,当且仅当 \(p\) 可以被划分成两个单降的子序列,称这个条件叫 \(A\)

发现这个限制可以用 Dilworth 定理来等价为:\(p\) 中不存在长度为 \(3\) 的上升子序列,称这个条件叫做条件 \(B\)

考虑证明 \(A\Leftrightarrow B\)。首先,\(A\Rightarrow B\) 是显然的,因为任意三个上升的元素一定无法被划分到两个单降子序列里;

那考虑 \(A\Leftarrow B\) 的证明,我们考虑对序列总长归纳,即证明每次新加入的元素一定能被划分。

具体的,现在有一个已经划分好的,长为 \(i\) 的序列 \(p\) 和一个新加在序列末尾的元素 \(x=p_{i+1}\)

其中 \(p\) 中的两个下降子序列分别是 \(q[1\cdots j]\)\(r[1\cdots k]\),且 \(q_j=p_i\)\(r_k=p_t\)

此时,若 \(x<p_i\),则我们直接将 \(x\) 放到 \(q_{j+1}\) 处即能合法,而当 \(x>p_i\) 时,

考虑 \(r_k\) 是否小于 \(x\),若不小于则直接将 \(x\) 接在 \(r\) 的后面,

否则我们一定可以将 \(r_k=p_t\) 插入到 \(q\) 里去,从而将 \(r\) 的末尾调整的更大。

因为在此时,若设在 \(p_t\) 左边和右边的第一个 \(q\) 中的元素分别是 \(p_l\)\(p_r\)

则一定有 \(p_l>p_t>p_r\),否则一定出现 \(p_l<p_t<x\) 或者 \(p_t<p_r<x\) 的两者之一,

也就不满足条件 \(B\),故此时我们将 \(r_k\) 插入到子序列 \(q\) 中,再对 \(r_{k-1}\) 进行于 \(r_k\) 类似的操作,

直到我们找到了 \(r_m>x\),或者将 \(r\) 中的所有元素全部调整到了 \(q\) 里。

故我们证明了,若所有长为 \(i\)\(p\) 永远有 \(B\Rightarrow A\),则所有长为 \(i+1\)\(p\) 也就永远有 \(B\Rightarrow A\)

那么我们对 \(A\Leftrightarrow B\) 的证明就结束了,即对满足 \(A\)\(p\) 计数等价于对满足 \(B\)\(p\) 计数。

那么,最后的问题就是如何解决 \(p_k=1\) 的限制,我们可以考虑对 \(p\) 的逆排列 \(pos:pos_{p_i}=i\) 计数,

因为我们发现,若 \(p\) 满足 \(B\) 条件,则不存在 \(1\le i<j<k\le n,p_i<p_j<p_k\)

也就不存在 \(1\le p_i<p_j<p_k\le n,pos_i<pos_j<pos_k\),故 \(pos\) 也满足 \(B\) 条件。

而我们发现,限制 \(p_k=1\) 在考虑逆排列时是好处理的,因为 \(p_k=1\Leftrightarrow pos_1=k\)

而对第一个数的限制是方便的,我们考虑用 DP 就能解决对 \(pos\) 的计数。

具体的,我们设 \(f(i,j)\) 为,考虑了 \(pos\) 中的前 \(i\) 个数,此时有多少个 \(pos\) 满足 \(B\) 条件以及 \(pos_1=j\)

发现此时是好转移的,我们有转移式 \(f(i,j)=(\sum\limits_{k<j}f(i-1,k))+f(i-1,j)[j<i]\)

原因是简单的,分类讨论 \(pos\) 中第一个数的值和第二个数的值即可,具体留给读者自行思考。

那么,最后的答案就是 \(f(n,k)\times2^{\max(n-k-1,0)}\),我们也就得到了一个 \(O(n^2)\) 的做法。

(当然,直接做是 \(O(n^3)\) 的,但笔者相信,看到这篇题解的读者一定都会前缀和优化转移)

代码很简单,就不放了。

posted @ 2022-03-29 21:05  GaryH  阅读(45)  评论(0编辑  收藏  举报