2024.9.18训练记录
订正昨天早上的模拟赛
T1 还没做,dp写法好像要记录什么的感觉好麻烦
T2
考试没做出来,其实是挺裸的dp
状态 记pair<int, int>
\(f[i][j][k]\) 表示前 \(i\) 个物品,拉出来 \(j\) 个 \(1\) ,\(k\) 个 \(2\) 所需要的 \({背包数,最后一个背包剩的空间}\)。
可以分讨最后这一位是否被拉出来转移。
注意 \(f\) 中只存没有被拉出来的物品的方案,考虑所有被拉出的物品在最后贪心处理。
最后枚举 \(f[n][j][k]\),那么就是 \(j\) 个 \(1\) 和 \(k\) 个 \(2\) 要放到 \(f[n][j][k]\) 的状态里,可以一个一个放贪心解决。
实际写起来的难点是贪心的细节。
总感觉可以 \(O(1)\) 做贪心。如果贪心为 \(O(n)\),总时间复杂度就是 \(O(n^3)\)。
T3
构造结论题。
将 \(b\) 序列分成全部为 \(L\) 和 \(R\) 的段来考虑。那么在段头尝试尽量填大的数。
最后的填数方式是:
设共有 \(k\) 段,在段头填上 \([a_k,a_k-1,a_k-2...a_1]\)。其余数从大到小正负交替填补。
样例:
3 8 2 13 7
LLRLL
先确定段头:
7 x 8 13 x
然后依次填段中:
7 3 8 13 2
最后考虑正负:
段头肯定按照段的正负来填。
第一个在某段中的数填第一个段头的反方向,后面所有在段中的数正负交替。
L R R L L
这样可以保证每一个前缀的正负性与当前需要的相等。
T4
方法1:根号分治。
选择阈值为 \(B = \sqrt {n}\)。
对于出现次数 \(cnt[i] \leq B\) 的每一个 \(i\),可以发现如果某段的绝对众数是 \(i\),段长 \(len \leq 2 * cnt[i] \leq 2 * B\)。
所以可以枚举每一个段长 \(\leq B*2\) 的段,判断这个段是否有一个绝对众数,且这个绝对众数 \(x\) 的 \(cnt[x] \leq B\)。
对于其他的 \(i\),可以发现这样的 \(i\) 的个数 \(\leq \sqrt {n}\)。所以可以对于每一个这样的i单独考虑。
对于这样的一个 \(i\),将原序列中的 \(i\) 视作 \(1\),所有不是 \(i\) 的数视作 \(0\),统计前缀和 \(S\),可以发现:
如果一个段 \([i, j]\) 的绝对众数是 \(i\),则 \(S_i - S_{j-1} > (i - j + 1) - (S_i - S_{j-1})\)。
即:
\(2S_i - i > 2S_{j - 1} - (j - 1)\) 且 \(i >= j\)
这是一个二位偏序,可以用权值树状数组维护。
两个答案加起来就是本题答案。复杂度 \(O(n \sqrt{n})\)。
下午 s初赛 真·真·真·信心赛。
\(n\) 个元素的二叉搜索树数量计数:
首先确定,和 \(n\) 个元素的具体值无关(离散化)。
二叉搜索树的性质是,左子树的值均小于根,右子树的值均大于根。
可写出递推式:\(f[i] = f[i - 1] * f[n - i]\)。
这是个卡特兰数。
字母表:
ABCDEFGHIJKLMNOPQRSTUVWXYZ
。
注意:P
在S
前面。