250419 D0 模拟赛 T1 题解
题意
给定一个长为 \(n\) 的排列 \(p\)。你可以进行一次操作:选定若干个互不相交的区间 \([l_1,r_1],[l_2,r_2],\cdots,[l_k,r_k]\),然后将每个区间内部进行升序排序。问通过这一次操作可以得到多少种不同的 \(p'\),输出答案对 \(998244353\) 取模的即如果。
\(n\le 2\times 10^5\)
题解
首先,对于区间之间的空隙,我们可以使用长度等于 \(1\) 的小区间填满。因此操作等价于将序列划分为若干区间,然后分别排序。
我们考虑使用 DP 求解。我们设 \(f_i\) 表示前缀 \(i\) 的答案。转移时,枚举前缀中的最后一个连续区间 \([j,i]\) 的位置 \(j\),然后从 \(f_{j-1}\) 转移。
注意到这样会统计到一些重复的贡献,因为把一个大区间拆分成两个(值域)无交的小区间,两者得出的序列是相同的,应该记为一种情况。
考虑钦定单射:对于一类等价的方案,我们只令其中的一种产生贡献。称一个区间是合法的,当且仅当它不能被拆分成两个区间分别排序,还能得到相同的效果。如果一种方案使用的所有区间都是合法的,则我们令这个方案产生贡献。能够证明,对于一种合法的 \(p'\),一定存在且仅存在一种合法的方案(反证法易证)。
为了去除不合法的区间所产生的重复贡献,我们考虑不合法区间 \([i,j]\) 的性质:存在一个分界点 \(k\) 使得 \(\max\{a[i,k-1]\}<\min\{a[k,j]\}\)。
到这里,我们已经可以使用一个二维的 dp 解决这个问题:使用第一个维度记录下标,第二个维度记录最后一个区间中的最大值。通过前缀和优化可以做到 \(O(n^2)\)。
这个 dp 已经很优了,不容易直接进行优化。我们进一步观察不合法区间的性质。考虑固定 \(\max\{a[i,k-1]\}=a_p\)。记 \(a_i\) 左边第一个比它大的位置为 \(mxl[i]\),右边第一个比它大的位置为 \(mxr[i]\)。容易观察到 \(k\le mxr[p]\),否则 \(\max\{a[i,k]\}\ne a_p\)。
进一步的,我们发现如果 \(k< mxr[p]\),则 \(a_k\in [k,j]\) 会导致 \(\min\{a[k,j]\}<\max\{a[i,k-1]\}\),无法找出不合法的区间。因此一定有 \(k=mxr[p]\)。
接下来我们分别考察 \(i\) 和 \(j\) 的取值范围。显然 \(i\in [mxl[p]+1,p]\)。而 \(j\) 需要满足 \(\min\{a[k,j]\}>\max\{a[i,k-1]\}=a_p\)。我们可以使用 st 表和二分,找到 \(j\) 的上界;其下界显然为 \(k\)。
这样,所有不合法的区间都被我们分为了 \(O(n)\) 组区间,我们只需要在转移时排除这些区间即可。
具体的,我们可以使用线段树,将当前所有不合法的转移点都标记在线段树上(区间 \(+1\)),然后从没有标记的位置转移(查最小值的数量)。时间复杂度 \(O(n\log n)\)。
AC 代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 |
|