我是薯薯大王
posted on 2025-01-06 05:01:32 | under | source
P4484
从小到大插入元素。类似 dp 套 dp,记 \(f_i\) 为 \(i\) 前缀中最大的 LIS 长度,那么在 \(x\) 位置插入元素后,\(f_x\gets f^{\prime}_x+1\),然后对后面的取 \(\max\)。考虑对其差分数组计数,不难发现 \(d\le 1\),然后打表即可。
\(O(n^22^n)\)。
P5400
二项式反演,求钦定 \(i\) 个极大数的方案。首先有顺序地从小到大选出 \(i\) 个极大数,即为 \(A(n,i)A(m,i)A(l,i)\)。然后赋值方案转化为森林的拓扑序,则只有极大数子树 \(>1\)。不难发现,第 \(j\) 小极大数的子树大小为前 \(j\) 小极大数覆盖格子的数量,即 \(nml-(n-j)(m-j)(l-j)\)。然后滚动处理即可。
\(O(n\log V)\)。
AT_arc138_e
不妨先让所有 \(a-1\),并将 \(a_0\) 考虑进去。转化题意,让 \(i\to a_i\),那么构成若干条链。考虑下降子序列的形态,发现形如一道“彩虹”。“彩虹”由 \(k\) 条链组成,且可以从一条中线剖开。不妨枚举“彩虹”两侧的点数量 \(i,j\),答案即为:
即选取构成“彩虹”的点,左右分别组成 \(k\) 条链,即第二类斯特林数,\(F\) 是将剩下的点任意组成链,即第二类斯特林数行的和。
\(O(n^2)\)。
CF1942G
记 \(cnt\) 为还可以抽几张卡。那么 A 类牌或特殊牌减一;\(B\) 类牌不变;\(C\) 类牌加一。先不考虑 \(B\) 类牌因为无影响,最后乘上多重排列即可。以时间为 \(x\) 轴、\(cnt\) 为 \(y\) 轴,得到起点为 \((0,5)\) 一条折线。考虑计算非法情况,因为一定会碰到 \(x\) 轴。
具体来说:枚举第一次碰到 \(x\) 轴的时刻 \(i\),可得 \(c_0,c_1\) 为此前进行多少加减操作。先算恰在此时碰到 \(x\) 轴的方案,即前 \(i-1\) 时刻不碰到,经典套路容斥翻折即可;再算 \(i\) 时刻后的方案;最后算在减操作中选取 \(5\) 个特殊牌,使得 \(i\) 时刻前数量 \(<5\) 的方案,容易容斥。
\(O(a)\)。
P4931
易算选出 \(k\) 个 cp 的方案,问题变为求错排。记 \(f_n\) 为 \(n\) 排 \(n\) 对 cp 时错排方案。转移枚举第一排的两个人,再考虑他们的原配。假如放在一排,则归为 \(f_{n-2}\);否则,不妨视他们两为一对 cp,归为 \(f_{n-1}\)。
\(O(n+T)\)。
AGC064D
将原序列视为 \(m\) 个形如:一个 B 前面紧跟着一段极大 R。不妨从左往右依次给予每个 B 编号,不难发现结果序列中 B 的编号是任意排列 \(P\) 满足 \(P_m=m\)。再考虑 R,对于第 \(i\) 个 B 前面跟着的每个 R,都可以选择接在第 \(j\ge i\) 个 B 前面。
考察结果序列是否可构造,首先不用考虑第 \(m\) 个 B,因为前面的 B 都满足了它肯定也满足。然后要给前 \(m-1\) 个 B 编号,显然有贪心:优先给跟着的 R 数量较大者较大的编号。于是得出判定条件:
- 记 \(a_1\dots a_{m-1}\) 为原序列前 \(i\) 段连续 R 的数量、\(b_1\dots b_{m-1}\) 则是结果序列的。
- 合法当且仅当 \(\forall i,b_i\le a_i\)。
直接按数值从小到大 dp,记 \(f_{i,j,k}\) 为考虑 \(1\dots i\) 的数值,总和为 \(j\),选了 \(k\) 个的权值和。权值为每种值次数的阶乘逆元之积,用于计算多重排列。答案枚举第 \(m\) 个 B 前面接了几个 R 即可。
\(O(n^3\ln n)\)。
CF1874F
容斥,对于两个严格相交的区间 \(l_1<l_2\le r_1<r_2\),限制可以拆成 \([l_1,l_2),[l_2,r_1],(r_1,r_2]\)。那么不难发现,此时加上区间 \([l_2,r_1]\) 不影响答案,但容斥系数相反,抵消了。于是只考虑包含、不交的情况即可。
显然构成树形结构,可以记 \(f_{l,r}\) 为只考虑 \([l,r]\) 内的区间、且 \([l,r]\) 一定选,\(g_{l,r,x}\) 为不强制选 \([l,r]\)。转移是容易的。复杂度 \(O(n^4)\)。
P8478
记 \(c_{i,j}\) 为格子 \(i\) 流向 \(i+j\) 的水,\(c_{i,0}\) 为保留下来的水。那么答案即为:
和式连乘等价于从每个和式中选取一个并相乘。由 subtask2 的启发,尝试将选出的 \(c\) 中第一维相同的放在一起处理,以到达分离变量的目的。不妨记 \(S_i\) 为选取的 \(c\) 中第一维为 \(i\) 的 \(i+j\) 集合,则有:
假设枚举 \(S\),则每个 \(i\) 互相独立,考虑计算其一。不难发现,当 \(|S_i|=j\) 固定时,\(i\) 的贡献也是固定的,记为 \(h_{i,j}\)。再记 \(r_i\) 为 \(c_{i,j}\) 中 \(j\) 的数量(可以流向的位置),考虑计算 \(h\),等价于以下问题:
有 \(r_i\) 个盒子,其中已确定了 \(|S_i|\) 个特殊盒子的位置。需要向盒子里放 \(a_i\) 个球,特殊盒子贡献 \(x\) 为放入球的数量、非特殊盒子无论如何贡献 \(1\)。一种方案贡献为盒子贡献的成绩,求总贡献?
为两类盒子设计生成函数,用级数推一推即可得出总贡献为:\(C(a_i+r_i-1,s_i+r_i-1)\)。再考虑 \(S\) 的限制,实际上就是每个位置 \(i\) 恰选取一个 \(j\) 并对 \(S_j\) 产生 \(1\) 的贡献。
自然有暴力状压做法,sos dp 优化为 \(O(nk^22^k)\)。可过较小的情况。
对于 \(k\) 较大的情况,考虑 \(k=n\) 的做法,发现记录此前还剩多少位置可以产生贡献即可。于是考虑容斥,钦定一些位置向 \([1,i-k)\) 产生贡献,套用 \(k=n\) 的做法即可。如何钦定?只需在 \(i-k-1\) 的位置才考虑 \(i\) 的贡献即可。复杂度 \(O(n^3 2^{n-k})\)。
QOJ5357
设有两颗分别以 \(u,v\) 为根的子树,现有边 \((u,v)\),考虑点分治方案的合并。分治中心分别为 \(x,y\),那么每次选择其一,进入 \((u,v)\) 所在的子树并删掉其它子树。\(x=u\) 或 \(y=v\) 时所代表的子树被删完故停止。考虑点分树,那么本质就是对 \(u,v\) 所在祖先链进行归并。
记 \(f_{u,i}\) 表示考虑 \(u\) 子树的点分治方案中,\(u\) 祖先链长度(深度)为 \(i\) 时的方案。转移再枚举 \(f_{v,j}\),则:
发现与 \(j\) 无关,只需预处理后缀和。\(O(n^2)\)。
P10104
显然容斥,但边数过多,于是枚举连通块,再乘上连通块的容斥系数即可。不难连通分量 dp 解决。对于点数为偶数的连通块取值任意无影响;对于点数为奇数的,取值上界为其最小值,然后归约为 \(m=0\) 的问题。
考虑将每个数拆分为 \(\log\) 个区间,设已经确定了具体是哪个区间,发现对于最大的区间(放开限制的位最大的那个)可以起到“调整”的作用,即其它数任取,则存在恰好一种调整为 \(C\) 的方案。简单 dp 即可。我们提前预处理出来。
回到原问题,状态数较冗余且会算重。解决方案是为连通块定序:将 \(a\) 从小到大排,记 \(S\) 为已被选取的点集,用 \(i\) 从左到右扫,每扫到一个未被选取的点就让其组成一个连通块,并用 \(T\) 记下该数。现在不会算重,且 \(S\) 为 \([1,i]\) 超集、\(T\) 为 \([1,i]\) 子集,状态 \((S,T)\) 总数是 \(2^n\) 的。转移枚举子集,可以接受。
\(O(n3^n+n\log V2^n)\)。
P5417
CF1456E
将一个数按上下界分别拆分为 \(\log\) 个区间,假如已经确定区间的选取,画成从上到下的柱形图,分别考虑一层的贡献。易发现被两个柱子夹住的空白区域,可以贪心地填写使得总贡献取决于两侧柱子的取值(这显然是下界,因为假如两侧不同至少取一次贡献)。区间 dp 即可,但是本题区间下界为 \(0\),没有办法偷懒变成开区间,所以还得专门做一遍 dp。
复杂度忘了。
CF1081G
构建归并树,但叶子是无序数列。先考虑叶子内部的贡献,显然是 \(\frac {len(len-1)}{4}\),每个数对顺逆是随机的。然后模拟归并且统计每一层内部的贡献是困难的,因为进行完归并后会带有某些顺序,导致并非随机。探寻归并本质,实际上就是两侧按照前缀最大值划分,然后根据前缀最大值排序。不妨考虑两个叶子(不一定相邻)间的贡献,考虑 \(A_i,B_j\) 何时产生贡献。若 \(A_i,B_j\) 有一个是原叶子的前缀最大值,则不可能产生逆序对。反之,产生逆序对的概率是 \(\frac 12\)。由经典结论叶子的大小至多两种,大力计算即可。
复杂度 \(O(n\log n)\),当然可以 \(O(n)\)。
CF1707D
二项式反演去除真子集的限制。题意变为:求恰在 \(i\) 时刻变为 \(\{1\}\) 的方案,时刻 \(0\) 为全集,每时刻可以删除一些点但需保证对 LCA 封闭。对 LCA 封闭等价于对于每个 \(u\),假如至多存在一颗子树内仍有点未删,才可删去。考虑 dp,记 \(f_{u,i}\) 为恰在 \(i\) 时刻删空 \(u\) 子树的方案。转移讨论 \(u\) 在哪个时刻删去,假如在 \(j<i\) 时刻删去,则需保留恰好一个子树在 \(i\) 时刻删、其它子树在 \(\le j\) 时刻删。前缀后缀积优化即可。
\(O(n^2)\)。
CF1647F
诈骗题,并非计数。注意到最大值一定是峰顶,考虑判定即可。设另一个峰顶在最大值右边,那么将原序列划分为三段,左边是划分为两个递增序列,使得其一尽量小,右边同理。中间是找一个递增一个递减,dp 即可,转移考虑相邻两项分别属于哪种序列。
\(O(n)\)。
CF1349F1
构造计数题。条件等价于 \(k\) 的最小出现位置小于 \(k+1\) 的最大出现位置,然后你脑电波受到宇宙射线影响,联想到了将排列划分为若干下降连续段的过程,你发现该过程恰好满足上述条件——连续段的结尾即最小值小于下一段的开头即最大值,故将第 \(i\) 个下降段视作元素 \(i\) 的出现位置即可。显然是双射。然后直接计数即可,预处理欧拉数。
\(O(n^2)\)。

浙公网安备 33010602011771号