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\) 个禁止放置的格子的路径数的做法用二项式容斥解决。

当平行时,需要写个拓扑排序判无解,然后转化成拓扑序计数问题。

posted @ 2023-01-30 13:49  Displace  阅读(48)  评论(0)    收藏  举报