ARC186 做题记
A (Underclued)
题意
对于每个元素均为 \(0\) 或 \(1\) 的 \(N\) 阶方阵 \(A,B\),若满足以下条件,则称 \(A\) 和 \(B\) 相似:
- 每一行的元素和相等。即对于任意 \(i=1,\dots,N\),都有 \(A_{i,1}+\dots+A_{i,N}=B_{i,1}+\dots+B_{i,N}\)。
- 每一列的元素和相等。即对于任意 \(j=1,\dots,N\),都有 \(A_{1,j}+\dots+A_{N,j}=B_{1,j}+\dots+B_{N,j}\)。
此外,对于每个元素均为 \(0\) 或 \(1\) 的 \(N\) 阶方阵 \(A\) 和整数 \(i,j\)(\(1\leq i,j\leq N\)),如果对于所有与 \(A\) 相似的方阵 \(B\),都有 \(A_{i,j}=B_{i,j}\),则称 \(A\) 的第 \(i\) 行第 \(j\) 列元素是被固定的。
请回答以下 \(Q\) 个询问。
- 第 \(i\) 个询问:是否存在某个 \(N\) 阶 \(0,1\) 方阵,使得其被固定的元素恰好有 \(K_i\) 个?若存在,输出
Yes,否则输出No。
\(N\le 30\)
题解
困难题,需要一些小观察。
结论 \(1\): 建立两边各 \(n\) 个点的二分图,如果 \(a_{i,j} = 0\), \(L_i\) 向 \(R_j\) 连边,否则 \(R_j\) 向 \(L_i\)。那么两个矩阵相似等价于每个点的出入度相同。
结论 \(2\): 不动点的数量等于这张图上不在任何环上的边的数量。
结论 \(1\) 是显然的:入度就是行和,出度就是列和;结论 \(2\) 只需要把每个环倒转方向后的图都拿出来,他们和原图都相似,这时候只有非环边不变。
所以直接 dp 就行了:设 \(f_{i,j,k}\) 为左部 \(i\) 个点,右部 \(j\) 个点,有 \(k\) 条环边的方案数。转移就是枚举一个强连通分量,两侧分别有 \(u,v\) 个点,那么会多出 \(u \times v\) 条环边。最后从任意的 \(f_{i,j,*}\) 转移到答案。
时间复杂度 \(\mathcal{O}(\frac{n^6}{w})\)。
B (Typical Permutation Descriptor)
题意
给定一个长度为 \(N\) 的整数序列 \((A_1,\dots,A_N)\)。该整数序列满足对于每个 \(i=1,\dots,N\),都有 \(0\leq A_i < i\)。请计算满足以下条件的 \((1,\dots,N)\) 的排列 \((P_1,\dots,P_N)\) 的个数,并对 \(998244353\) 取模。
- 对于每个 \(i=1,\dots,N\),
- 对于所有满足 \(A_i < j < i\) 的整数 \(j\),都有 \(P_j > P_i\)。
- 如果 \(A_i > 0\),则 \(P_{A_i} < P_i\)。
保证对于输入给定的 \((A_1,\dots,A_N)\),一定存在满足条件的排列。
\(1\leq N\leq 3\times 10^5,0\leq A_i < i\)
题解
注意到 \(A_i\) 就是 \(i\) 左边第一个大于其的数。
再注意到在用单调栈构建笛卡尔树的过程中,我们其实不需要知道每个数具体的值,只需要知道每个值左边第一个大于其的数即可构建出笛卡尔树。
所以问题转变为存在多少种向笛卡尔树中填数的方案。
相当于树的拓扑序计数,答案为 \(\frac{n!}{\prod_{u} sz_u}\)
C (Ball and Box)
题意
球橋和箱木进行一个用球和箱子的游戏。
一开始,球橋有 \(M\) 种不同的球,每种球各有 \(\infty\) 个,箱木有 \(\infty\) 日元。同时有 \(N\) 个箱子,第 \(i\) 个箱子的容量为 \(V_i\),价格为 \(P_i\) 日元。在游戏过程中,箱木可以随时购买任意箱子。
游戏过程中,以下操作会不断重复,直到游戏结束:
- 球橋选择一种球,递给箱木。
- 箱木可以选择接收这个球,或者 拒绝接收并结束游戏。
- 如果箱木接收了球,他需要从已购买的箱子中选择一个,将球放入该箱子。
- 若 放入球后的箱子 满足以下条件,箱木获得 \(1\) 日元,否则 游戏结束:
- 箱子中的球的数量不超过该箱子的容量。
- 箱子中的所有球都是同一种类型。
箱木想让最终自己的钱最多,球橋相反要搞破坏。求箱木的所持金钱最多能增加多少?
注意双方都知道所有信息,并且绝顶聪明。
\(1 \leq N, M \leq 3 \times 10^5,1 \leq V_i, P_i \leq 10^9\)
题解
称买盒子放球的人为 A,发配不同颜色的球的人为 B。
我们发现 A 的决策比较麻烦,因为他每次买什么盒子是需要决策的;而 B 显得就比较单纯可爱了:
A 手上有一些盒子,那么 B 肯定希望 A 去买新盒子,所以如果目前 A 存在一种颜色没法放了,B 会给他发一个这个颜色的球,A 去买一个新盒子。如果不存在这样的颜色,那么 B 肯定希望 A 尽快买新盒子,所以会选择容量最小的那个盒子填满,然后再放一个这个颜色的球,这样就需要买新盒子了。
现在 B 的决策固定了,我们只需要计算对于一种 A 选盒子的方案,收益是多少就行了。
回忆一下目前的计算方式:
-
维护一个集合 \({S}\)。
-
当 \(|{S}| < m\) 时,加入一个 \((v,p)\),获得 \(-(p-1)\) 的收益;
-
当 \(|{S}| = m\) 时,删除 \(v\) 最小的 \((v,p)\),获得 \(v-1\) 的收益,回到上一步。
我们发现最后剩下的 \((v,p)\) 一定是 \(v\) 最大的 \(m-1\) 个。所以先对 \(v\) 排序,然后做一遍扫描线。
前缀要选出所有 \(v-p > 0\) 的,后缀要选出 \(p\) 前 \(m-1\) 小的,用堆维护即可。
记得特判 \(m=1\),时间复杂度 \(\mathcal{O}(n \log n)\)。
D (Polish Mania)
题意
非空非负整数序列 \((V_1,\ V_2,\ \dots,\ V_M)\) 被称为 Polish,其递归定义如下:
- 存在 \(V_1\) 个 Polish 序列 \(W_1,\ W_2,\ \dots,\ W_{V_1}\),使得将序列 \((V_1),\ W_1,\ W_2,\ \dots,\ W_{V_1}\) 按顺序连接后,恰好得到序列 \((V_1,\ V_2,\ \dots,\ V_M)\)。
特别地,序列 \((0)\) 是 Polish。
给定一个长度为 \(N\) 的非负整数序列 \((A_1,\ A_2,\ \dots,\ A_N)\)。请你求出,长度为 \(N\)、字典序不大于 \((A_1,\ A_2,\ \dots,\ A_N)\) 的 Polish 序列的个数,对 \(998244353\) 取模。
关于序列的字典序:设 \(S = (S_1,S_2,\ldots,S_{|S|})\),\(T = (T_1,T_2,\ldots,T_{|T|})\),则 \(S\) 的字典序小于 \(T\),当且仅当满足以下两条之一(其中 \(|S|,\ |T|\) 分别为 \(S,T\) 的长度):
- \(|S| < |T|\) 且 \((S_1,S_2,\ldots,S_{|S|}) = (T_1,T_2,\ldots,T_{|S|})\)。
- 存在整数 \(1 \leq i \leq \min\lbrace |S|,\ |T| \rbrace\),使得以下两点同时成立:
- \((S_1,S_2,\ldots,S_{i-1}) = (T_1,T_2,\ldots,T_{i-1})\);
- \(S_i\) 小于 \(T_i\)(按数值比较)。
\(1\leq N \leq 3\times 10^5,0\leq A_i < N\)
题解
结论:一个序列合法当且仅当:
- \(\sum a_i = n-1\)。
- 不存在 \(i \in [1, i-1]\) \(\sum\limits_{j=1}^{i} a_j \le i-1\)。
转化问题:
\(a_i\) 是非负整数序列,其前缀和为 \(s\)。称其是好的当且仅当:
-
\(s_n=n-1\)
-
\(\forall i\in [1,n-1],s_i\ge i\)
钦定 \(a_0=1,s_i>i,s_n=n\)。
相当于求 \((0,1)\to (n-1,n)\) 不经过直线 \(y=x\) 的的方案数。
这东西是格路计数,反射容斥一下,答案为:
其中 \(F(a,b,c,d)=\dbinom{c+d-a-b}{c-a}\)。
然后字典序的限制就枚举 LCP,枚举不同的位填啥,然后假设走到 \((x,y)\),答案为 \(F(x,y,n-1,n)-F(y,x,n-1,n)\)。
由于不能走过 \(n\),于是暴力枚举是可以接受的。
E (Missing Subsequence)
题意
给定一个由 \(1,\dots,K\) 组成、长度为 \(M\) 的整数序列 \((X_1,\dots,X_M)\)。
请计算满足以下条件的长度为 \(N\) 的整数序列 \((A_1,\dots,A_N)\)(每个元素均为 \(1,\dots,K\))的个数,并将结果对 \(998244353\) 取模后输出。
- 在所有由 \(1,\cdots,K\) 组成、长度为 \(M\) 的整数序列中,只有 \((X_1,\dots,X_M)\) 不能作为 \((A_1,\dots,A_N)\) 的(不要求连续的)子序列。
\(2\leq M,K \leq N \leq {\color{red}{10^5}},1\leq X_i \leq K\)
题解
这道题主打一个简单粗暴,条件看起来很神秘,但是直接做就能顺利解决。
首先找到序列 \(A\) 里面的第一个 \(1, 2, 3, \dots, k\), 那么容易发现:
-
第一个 \(X_1\) 后面的 \(A\), 应该包含所有长为 \(m-1\) 但不为 \(X_2, X_3, \dots, X_m\) 的序列为子序列。
-
其他数第一次出现之后的 \(A\), 则应该包含所有长为 \(m-1\) 的序列为子序列。
这样就很有递推性质了!
提取出 \(A\) 中最短的在每个数的前缀,这个前缀以外的方案数就是一个 \(m\) 减少了 \(1\) 的子问题。
不断划分下去,可以划分出 \(m-1\) 个前缀和一个 \(m=1\) 时容易解决的子问题。只要求出每个前缀的情况数然后再乘起来就可以。
那么这个前缀有什么限制呢?
首先,可以得出 \(X_1\) 应该只在前缀的末尾出现过一次,其为最晚出现的数。
同时,由于那个 \(X_1\) 后面的序列包含所有长为 \(m-1\) 但不为 \(X_2, X_3, \dots, X_m\) 的序列为子序列,那么它显然会包含 \(X_3, X_4, \dots, X_m\) 为子序列。
因此 \(A\) 里面出现第二晚的数后面的序列能把 \(X_2, X_3, \dots, X_m\) 这个子序列补回来的充要条件就是 所选前缀内,出现第二晚的数后面存在至少一个 \(X_2\)。
这里 出现 指的是第一次出现,第二晚出现即 第一次出现的时刻第二晚。
\(X_1 = X_2\) 时,就没有第二个条件的限制,前面用个 \((e^{(n-1)x}-1)^{k-2}\) 算算即可。
而 \(X_1 \neq X_2\) 的情况都等价,也就是说前缀的情况数只和 \([X_1 = X_2]\) 和前缀长度有关。
这东西大概就对第二晚出现的数这个位置分段,然后每段写个 GF 再乘起来即可。
即我们也不关心第二晚出现的数是啥,只关心其位置,最后 \(\times (k-1)\) 即可。
然后再统计有多少 \(i\) 满足 \(X_i = X_{i+1}\),再用多项式快速幂合并即可。时间复杂度 \(\mathcal{O}(n \log n)\)。

浙公网安备 33010602011771号