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
注意:PS前面。

posted @ 2024-09-18 10:53  docx君  阅读(4)  评论(0编辑  收藏  举报