2025.6.7 模拟赛
2025.6.7 模拟赛
number
记 \(S_k(n)\) 为 \(\le n\) 有 \(k\) 个 \(1\) 的数量,则题目要求 \(S_k(2n)-S_k(n)=m\)。
注意到 \(2n\) 和 \(n\) 相比只多了一个 \(0\),于是 \(S_k(2n)\) 和 \(S_k(n)\) 的形式应当是相近的。
考虑单独计算时我们常用形如 \(f_{i,j,0/1}\) 的数位 dp,注意到 \(S_k(n)=f_{a,k,0}+f_{a,k,1}\),\(S_k(2n)=f_{a+1,k,0}+f_{a+1,k,1}=f_{a,k,0}+f_{a,k,1}+f_{a,k-1,1}\),则 \(S_k(2n)-S_k(n)=f_{a,k-1,1}=S_{k-1}(n-1)\)。
只需计数 \(S_{k-1}(n-1)=m\) 的数量,这是非常好的,因为这样 \(n-1\) 的范围是 LONG_LONG_MAX,用 unsigned long long 存就完全没问题了。
于是我写了非常笨的 \(O(T\log^3n)\),峰值 980ms。
但显然 dp 是傻的,可以枚举第一个 \(1\to 0\) 的位,组合数直接算。
于是大家都是高贵的 \(O(T\log^2 n)\)。
permutation
考虑对生成序列计算,形如若干区间叠合,可以 \(O(n^2)\) 决策开始/结束区间进行 dp。
证明一下这样一定能构造:
满足要求的匹配形如若干递增链,要求除钦定边外都是 \(p_i>p_{i+1}\),按递增链最大值从大到小构造即可。
platitude
神奇观察题。
先把操作统一为把序列末尾的元素移到下一个序列末尾,这样原序列 \(t\) 要 reverse,栈 \(a\) 的要求是从前到后递增,容易推出栈 \(b\) 要求从前到后递减,否则就没法有序插入 \(q\)。
一般考虑第一个放进 \(q\) 的元素 \(1\),假设 \(t_i=1\),则 \(i\) 后面的元素必须全部在 \(b\) 中。
注意到这段后缀中不能存在形如 \(i<j<k,p_i>p_k>p_j\) 的子结构,考虑刻画合法的序列形态。
从后往前加数,考虑维护极短的 \(a\) 小值 \(\to\) \(a-1\) 小值 \(\to \cdots \to\) 次小值 $\to $ 最小值 连续段,要求第 \(a+1\) 小值在 \(a\) 小和 \(a-1\) 小中间。
此时新加的数不能大于 \(a+1\) 小,但可以任意插入 \(i\) 小和 \(i+1\) 小中间,即 \(a\to [1,a+1]\)。
刻画成二元组,\((i,a)\to (i+1,[1,a+1])\),再转化成 \((i,i+1-a)\to (i+1,[i+1-a,i+1])\),即 \((x,y)\to (x+1,[y,x+1])\)。
直接映射成 \((1,1)\to (n,n)\) 的不越过 \(y=x\) 的格点路径,方案数就是卡特兰数。
考虑 \(1\) 前面的数,在值域上被划分成若干连续段。注意到这些段间必须按从前往后从大到小顺序放,段内和原问题要求一样。
于是写出生成函数,记卡特兰数生成函数为 \(C\),原题生成函数为 \(F\)。


浙公网安备 33010602011771号