2023.1.30 省选模拟赛总结
1.时间安排
7:30~8:00
浅看三题题面:T1是排列的DP,T2是逆序对相关的数据结构,T3是计数。
先开T1:
考虑如果给定 b 序列怎么判断其是否合法,考虑倒叙枚举,从贪心的角度维护一个"对号"一样的形状,可以证明这样最优,如果发现某个元素无法插进"对号"里一定不合法。
这样就可以写暴力了,复杂度 \(O(n*n!)\),但是可以打表,发现 \(m=1\) 是2的幂,\(m=n\)是卡特兰数,一共40pts。
8:00~9:30
先把T2暴力 \(n^3\) 写了方便对拍。
一开始认为是维护若干上升序列,答案是上升序列逆序对数量+逆序对长度,但是这个上升序列太难维护了,而且复杂度似乎不如 \(n^3\),就放弃了这个思路。
答案实际上就是逆序对数加上题目中的 \(v\) 数组为1的位置个数,打表发现 \(v\) 数组具有继承关系,于是可以 \(n^2\) 暴力记录并维护 \(v\) 数组。
对于排列的情况,发现每次 \(v\) 数组更新是一次对后缀的区间覆盖,用线段树维护即可,复杂度 \(nlogn\),一共65pts。
但是感觉这个做法很难拓展到正解,就没有细想。
9:30~11:00
(最不喜欢的一题)
一眼看上去T3没有一分会写,感觉很像高斯消元,但是数据范围 \(n=500\) 而且矩阵大小还是其常数倍,肯定不能做。
有一个部分分是两个基本步是平行关系,于是决定写这20pts。
经过1h+的暴力分讨,终于写完了,没有大数据只能自己手构一些小数据测试,没什么问题,寄希望于数据水,不卡没考虑到的边界情况。
(分讨题似一似,谢谢喵)
11:00~12:00
尝试T1的 \(n^2\) DP,打表发现 b 的形状可以表示为一个上升序列挑出若干相邻的区间交换,就DP这个东西。
一直到比赛结束都没调出来,应该是思路错了。
result:
T1:40 T2:50(爆int了……) T3:30
2.总结
T1:
原题解过于抽象,经过与Cafard和Larunatrecy的2h+讨论后得出了2种理解,这里写下我个人的理解。
从前/后缀和的角度理解本题。
首先 A 序列一定是"√"的形状,既然是对 B 序列计数,就考虑怎么把合法的 B 序列还原成"√"。
有一种策略是先把"√"的左侧尽量填满,左侧填不下再填右侧,这样构造可以设计 dp 状态,用 \(f_{i,j}\) 表示 B 的前 \(i\) 个数中最小的是 \(j\) 的方案数,转移方程为:$$f_{i,j}=\sum_{k=j}^n f_{i-1,k}$$
边界为 \(f_{0,n+1}=1\),表示填一个虚空的 \(n+1\),后面填任意的数都一定会小于 n+1。
这样的 dp 做到 \(f_{k-1}\) 就足够了,后面 \(n-k\) 个元素一共有 \(2^{n-k-1}\) 种方案,容易发现他们都是合法的。
所以我们的目标是计算 \(2^{n-k-1}*\sum_{i=2}^n f_{k-1, i}\)
用后缀和 \(g_{i,j}=\sum_{k=j}^n f_{i, k}\)
则我们要计算的是 \(2^{n-k-1}*g_{k-1, 2}\)
则 $$f_{i,j}=g_{i-1,j}$$
因为 $$g_{i,j}=g_{i,j+1}+f_{i,j}$$
所以 \(g_{i,j}=g_{i,j+1}+g_{i-1,j}\)
这个式子很像格路计数,考虑设 \(h_{i,j}=g_{i,n+1-j}\),我们的目标变为 \(2^{n-k-1}*h_{k-1, n-1}\)。
则上式可以表示为 \(h_{i,j}=h_{i,j-1}+h_{i-1,j}\)。
这就是格路计数的式子了,初始值为 \(h_{0,0}=1\)。
则 \(h_{k-1,n-1}\) 就表示从 \((0,0)\) 沿格路走到 \((k-1,n-1)\) 且路径不越过 \(y=x\) 的方案数,应用卡特兰数的几何意义求得答案为 \(C^{k-1}_{k+n-2}-C^{k-2}_{k+n-2}\)。
所以我们的目标变为 \(2^{n-k-1}*(C^{k-1}_{k+n-2}-C^{k-2}_{k+n-2})\)。
预处理组合数即可,复杂度线性+快速幂,注意边界情况特判。
T2:
没想到我的做法确实能拓展,%Larunatrecy场切,有两种做法,这里讲一下Larunatrecy的那种可以由我的做法拓展得到的做法。
我的做法瓶颈在于依赖排列,然而每个数在 \(v\) 数组中只会从0变成1,所以考虑暴力更新 \(v\) 数组,每次只更新原来是0的位置。
考虑新增位置 \(i\) 时,只会与前面小于它的数做交换,可以暴力在线段树上给这些颜色删去一个0(如果没有就不删去),同时因为自己被交换到了前面,所以对自己的种类没有加入0的贡献。如果发现前面没有小于它的数,那么在线段树上就给自己加一个0。
容易证明正确性,复杂度均摊 \(O(nlogn)\)。
T3:
根据平面向量唯一分界定理,如果给定的两个向量不平行,那么终点和所有的陷阱都能用 \(ax+by\)(x,y是给定的向量)来表达(当然本题中要求a和b是非负整数)。
当不平行时,可以用棋盘上有 \(n\) 个禁止放置的格子的路径数的做法用二项式容斥解决。
当平行时,需要写个拓扑排序判无解,然后转化成拓扑序计数问题。

浙公网安备 33010602011771号