2025-8-14 总结

杨表

杨表总结

Domino for Young

情况

  • 时间:\(50min\)
  • 预期:\(\text{AC}\)
  • 实际:\(\text{WA }4\)

知识点

  • 杨表

思路

其实这道题十分简单,我们首先可以证明第一个结论:如果一个杨表黑白染色后两种颜色的数量相等,那么其可以被多米诺骨牌密铺。该结论正确证明如下,从一个黑白染色后两种颜色的数量相等的杨表出发:

  1. 如果该杨表有两行长度相同、或两列高度相同,则我们可以填上一个骨牌使剩下的部分仍是杨表,且黑白格子数仍然相同;
  2. 如果没有,那么该杨表其黑白颜色格子数一定不同,矛盾;

那么一个杨表一定能被填满。所以这个证明完后可以得知如果想得到一个被覆盖的杨表则黑色格子数量和白色格子数量相等,所以我们就要考虑一些格子不选,使得最后黑色格子数量和白色格子数量相等,所以剩下的格子的数量一定为 \(2\times\text{max(黑色格子数量,白色格子数量)}\)。所以只需要统计白色各自数量和黑色格子数量即可,我们可以分以下四种情况:

  1. \(a_i\) 为奇数,\(i\) 为奇数,则 \(sum_1\) 加上 \(\frac{a_i+1}{2}\)\(sum_2\) 加上 \(\frac{a_i-1}{2}\)
  2. \(a_i\) 为奇数,\(i\) 为偶数,则 \(sum_1\) 加上 \(\frac{a_i-1}{2}\)\(sum_2\) 加上 \(\frac{a_i+1}{2}\)
  3. \(a_i\) 为偶数,\(i\) 为奇数,则 \(sum_1\) 加上 \(\frac{a_i}{2}\)\(sum_2\) 加上 \(\frac{a_i}{2}\)
  4. \(a_i\) 为偶数,\(i\) 为偶数,则 \(sum_1\) 加上 \(\frac{a_i}{2}\)\(sum_2\) 加上 \(\frac{a_i}{2}\)

所以这道题就解决了。

分析

这道题本来我的想法是贪心配对,因为发现如果有两个位置 \(x,y(x<y)\) 满足 \(a_x\)\(a_y\) 都为奇数,并且不存在一个数 \(z\) 满足 \(x<z<y\) 并且 \(a_x\) 为奇数,则有以下两种情况:

  1. \(x,y\) 奇偶性相同,则最后的答案减去 \(1\)
  2. \(x,y\) 奇偶性不同,则最后的答案不变;

所以我就贪心匹配,结果发现有一个反例:可以不选一个位置(相当于减去 \(\frac{1}{2}\)),然后选择后面两个位置,并且这两个位置不会产生减 \(1\),这样更优。所以经过了 \(20min\) 的思考,发现可以黑白染色,然后就做完了。

最长上升子序列

情况

  • 时间:\(1h\)
  • 预期:\(\text{AC}\)
  • 实际:\(\text{AC}\)

知识点

  • 杨表,\(\text{RSK}\),钩子定理

思路

由杨表的构造过程可知,一个序列构建的杨表其第一行长度就是 \(\text{LIS}\) 长度。因此我们想知道:对于每个 \(1\le k\le n\),对于一个长为 \(n\) 的排列,有多少种排列使得杨表的第一行长度为 \(k\)。由 \(\text{RSK}\) 得出,对于任何两个相同形状的杨表,可以与排列建立一一对应。因此我们要求的为:

\[\frac{1}{n!}\sum_{\lambda\vdash n}f_\lambda^2\lambda_1 \]

所以最后只需要通过钩子公式可以在 \(O(n)\) 时间内计算,所以就做完了。

分析

一开始想到了要利用杨表的性质来做这道题目,但一直没有找到 \(\text{LIS}\) 与杨表之间的关系。然后经过了一会的思考突然意识到因为杨表上的数是逐个递增的,所以杨表相当于就是 \(n\) 列上升子序列,由于最左边的数列长度一定大于右边的,所以最长上升子序列的长度就是第一列杨表的长度,然后就自然而然地想到了后面的做法。

Everlasting LIDS

情况

  • 时间:\(1h20min\)
  • 预期:\(\text{AC}\)
  • 实际:\(\text{AC}\)

知识点

  • 杨表,\(\text{RSK}\),钩子定理,\(\text{dp}\)\(\text{map}\)

思路

首先我们发现原本有 \(A\times B-1\) 个数,相当于一个缺失右下角的杨表,然后最后要加上一个小数,所以就会出现 \(A\times B\) 个不同的数字,于是添加后变成了一个 \(A\times B\) 的杨表。根据 \(\text{RSK}\),记填数的杨表第 \(i\) 行第 \(j\) 列的值为 \(t_{i,j}\),填插入顺序的杨表第 \(i\) 行第 \(j\) 列的值为 \(t^\prime_{i,j}\),所以可以得到最终答案就是两张表填数方案的乘积。

然后我们考虑如果计算方案数,我们可以发现第二张插入顺序的标准杨表,可以直接用钩子定理计算,所以我们只需要考虑第一个表的方案即可,于是想到了 \(\text{dp}\)由于杨表从上到下是单调递减的,所以我们开个动态数组维护每一行的列数,然后将这个状态的贡献存在 \(\text{map}\) 里。接着枚举当前状态,根据上面所说的性质判断这个状态的合法性,若合法把这个状态的贡献加在下一个合法的状态上即可。所以最后的答案就是一开始由钩子定理计算出的答案乘上状态 \(\{n,n,\cdots,n,n\}\) 的方案数,这样就做完了。

分析

一开始我认为答案是直接用钩子定理计算得到的,结果发现并不是的,因为第一个杨表可能加上的数会导致杨表的变动,所以不能直接用钩子定理。所以我看到计算方案数,又不能用排列组合,所以肯定用 \(\text{dp}\),所以就设 \(dp_{v}\)\(v\) 类型为 \(\text{vector}\))为当杨表第 \(i(1\le i\le m)\) 列为 \(v_i\) 时,方案数为多少,然后转移即可。由于直接用数组 \(n^m\) 会炸,所以使用 \(\text{map}\)

Mocha and Stars

情况

  • 时间:\(40min\)
  • 预期:\(\text{AC}\)
  • 实际:\(\text{AC}\)

知识点

  • \(\text{dp}\),容斥

思路

在处理 \(\text{gcd}\)\(x\) 的问题时,可以倒着枚举一个 \(i\),设 \(ans_i\)\(\text{gcd}\) 恰好为 \(i\) 的方案数,\(f_i\)\(\text{gcd}\)\(i\) 的倍数的方案数。那么就可以用 \(ans_x=f_x-\sum_{x|i}ans_i\) 来求解。用这个方法结合原来的背包,先用背包求出 \(f\),然后再进行下面的容斥就可以了。 具体地,设 \(f_{i,j}\) 是前 \(i\) 个和不超过 \(j\times x\) 的方案数,\(f_{i,j}=\sum f_{i-1,k}\),其中 \(k\) 是枚举之前的和能到这里的,\(l\)\(r\) 都要除以 \(x\) 处理,然后前缀和优化即可。初始化是 \(f_{0,i}=1\),因为是前缀和,每次叠了个 \(1\),实际上只有 \(f_{0,0}=1\) 目标状态是 \(f_{n,m/x}\),所以就做出了这道题目。

分析

这个问题主要难在 \(\text{gcd}\) 如何处理,容易想到要用容斥做,可是我却不知道应该怎样去容斥,在分解质因数的思路上花费了很多的时间,但是遗憾的是这是死路一条。最后才想到上面的方法。

楼梯

情况

  • 时间:\(1h30min\)
  • 预期:\(\text{AC}\)
  • 实际:\(\text{AC}\)

知识点

  • 杨表,可持久化线段树

思路

其实观察题目和图片可以发现,梯子其实就是一个杨表。然后我们发现问题中可以把删的操作分解,看做区间推平和区间减法,即可把修改变为对于一个线段树的维护。接下来我们再看询问,发现无处入手,我们换种思考方式,因为有了因数这一重要的约束条件,我们从小范围入手,可以发现一个性质:一个楼梯中总有一个以最右上方或左下方格子为边界的解。再反过来看,两个这样的边界可以确定一个唯一的子楼梯。而边界的集合也可以排出一个序列,也可以我们像刚才那样维护修改,转化成边界后,看似无用的因数一条件也可以派上用场了。进而发现当 \(q\times k=p\) 时,每次通过取中点可以排除一半的区间,进而找到答案,所以就做完了。

然后有一个没说的撤回操作可以直接用可持久化线段树,这样就可以达到撤回的目的了。

分析

其实我一开始看到题的时候压根不知道梯子是一个杨表,导致看了很久,也没看出梯子是个什么图形,看出来后也就想到了用可持久化线段树来维护答案,然后就想到了做法。搞笑的一点是,我打完代码后发现输出的第三行与答案不一样,然后查了将近 \(20min\),然后发现只需要输出一组可行的就可以了(我没看到这道题是 \(\text{SPJ}\))。

posted @ 2025-08-14 09:46  小熊涛涛  阅读(14)  评论(0)    收藏  举报