2026.9 模拟赛总结
9.3 模拟赛总结
代码源 CSP-S 模拟赛 Day 1。
7:47 开赛。第一次打代码源比赛,据 Air 所说非常困难,尝试看 T1,过了就算成功!
9:00 左右,思考了一个多小时,失败了。咋这么难。放弃了。去开 T2。竟然是图论题!想了会仍然没有思路,觉得要废了,有点慌。之后就是在 T1、T2 之间徘徊,写了点暴力代码就放那了。
10:00 左右,先跑去看 T3 了。暴力是容易做的,所以放着看 T4 了。竟然过了两个小时了!T4 神秘博弈论,很容易想到奇数 \(k\) 同 \(1\),偶数 \(k\) 同 \(2\),\(1\) 非常好写,于是快马加鞭写完了。\(2\) 的 \(n^3\) 同样无脑。
10:49 提交 T4,10:52 微调了一下,因为考虑可能不进行操作。本题期望得分 \(30\) 分。
转战 T1,如下是赛时注释:
把 n 个数放入 k 个盒子,每个盒子初始容量为 sz[i]。
设 cnt[x] 表示当前剩余容量为 x 的盒子数量。设 dp(rest) 表示目前剩余总容量为 rest,接下来的贡献和。
从大到小放,当前放数即为 rest。
放到剩余容量为 1 的盒子,则其为最小值,--cnt[1],贡献 rest * cnt[1] * dp(rest - 1)。
否则,枚举 x > 1,--cnt[x], ++cnt[x - 1],贡献 cnt[x] * dp(rest - 1)。
发现同种 cnt 对应的 rest 是固定的,基于 cnt 记忆化搜索,不知道能不能过,感觉状态数挺多的。
由于盒子内部任意排,记得将 sz[i]! 乘进答案。
坏了,大样例跑了 121s。。。
后面用 unordered_map 和哈希优化了一下,但是大样例仍然跑了 6s,所以彻底失败了。
11:23 提交 T1,期望得分 \(50\) 分(\(n \le 18\) 和段长 \(\le 5\) 的状态较少,能够通过大样例)。
转战 T2,回归暴力,每个点用 vector 存储一下字典序最小和次小的路径,跑一遍 Dijkstra 即可,时间复杂度 \(O(n\times m\log m)\),其中 \(O(n)\) 是 vector 比较的时间,实际跑不满 \(n\),常数极小。\(w_i = 1\) 的性质不太会,就先不写了。
11:32 提交 T2(因为之前写有暴力,所以交的很快)。本题期望得分 \(30\sim 50\) 分,具体要看常数。
我只有 \(15\) 分钟写 \(T3\) 了。其实还浪费了点时间检查 T1 和思考 T4,忽然想起来还有个 \(T3\),只写了 \(n \le 5\) 的暴力。
11:47 提交 T3。本题期望得分 \(5\) 分。
几乎同时出成绩。\(50 + 50 + 5 + 10 = 115\),T4 挂了 \(20\) 分,因为 \(maxr\) 初值为 \(0\),但 \(X * r - 2 * s_r\) 有可能有负数,导致出错。此外,不进行操作是不行的。因此改过后更错了。
14:00 出榜,85 名。了解到 Air 只有 \(120\) 分,mxf 只有 \(60\) 分,其余人都是一二三十分。这也太阴了。我说我是 deepseek 写的,他们说 deepseek 打的不一定有这么好。
关于 T1,发现有个 \(k \le 10\) 的 \(20\) 分没拿到,用状压实现。赛后发现正解也是状压,我和正解差了两招,一招是从小到大放,状态表示空盒子集合,另一招是混合进制。原本我写的状态有 \(6\times 10^6\) 级别,现在只有 \(2 \times 10^5\),就可过了。太遗憾了。赛后重写了一遍,注释如下:
把 n 个数放入 k 个盒子,每个盒子容量为 r[i] - r[i - 1]。设 cnt[x] 表示容量为 x 的盒子数量。
令混合进制 S 表示空盒子集合,以容量 len 为下标,cnt[len] 为值,每一位为 cnt[len] + 1 进制数。
怎样混合进制?考虑二进制数的第 i 位是它除以 2^{i - 1},再模 2;三进制同理。
因此,混合进制数的第 i 位是它除以前 i - 1 位的进制之积,再模第 i 位的进制。
设 sum[S] 表示 S 代表的空位数量,即:每位数字乘以其下标之和。
设 dp(x, S) 表示从小到大放,已经放完 1 ~ x,接下来的贡献和。
当前放的 x + 1:
放到非空盒子,贡献 (n - sum[S] - x) * dp(x + 1, S)。
否则,其为最小值,枚举放到长度为 len 的空盒子,这一位为 a,贡献(x + 1) * a * len * dp(x + 1, S 的第 len 位减去一)。
记忆化搜索,状态数位 \prod (cnt[x] + 1),最大可达 2e5 出头。
T2 怎么直接 DFS 做完了?建出最短路树,贪心走编号最小的边,若点被第二次访问,则为字典序次小的路径。T3 大概懂了,但是目前还没有订。T4 太过困难没有订。
这就是死磕 T1 的下场吗。时间方面分配的真不合理啊。
9.5 模拟赛总结
代码源 CSP-S 模拟赛 Day 2。
7:28 实在忍不住了,开赛。据 Air 说周六场较为简单。但是我怎么更炸了。
T1 简单分讨,但是确实要想一会。
7:55 提交 T1, 8:40 发现错了,可能会让一个元素先去顶着边界,再移动别人。找到最优的元素即可。9:01 提交 T1,期望得分 \(100\) 分。
这里发现其他人也都有点想法,估计 T1 是人均了。跑去看 T2。\(O(n \times \max a)\) 是好做的,\(a_i\) 互不相同的性质也想到做法了。然后去看 T3。\(n^2\) 也是好做的,链也是好做的,那还说啥呀写呗。
11:05 提交 T2,期望得分 \(65\) 分。11:07 提交 T3。11:17 对 T3 代码加入了链的情况,再次提交 T3,期望得分 \(45\) 分。
显然,我又没有时间了。T4 尝试不可以总司令,期望得分 \(100\) 分(滑稽)。
11:28 出成绩:\(30 + 55 + 0 + 0 = 85\)。怎么全炸了!
呵呵哒,T1 的 inf 设为 \(10^9\),但是最大可能有 \(2\times 10^9\)。。。这真亏吧!!!改完就过了。还我 \(100\) 分!!!
T2 \(a_i\) 互不相同的性质做法假了,暂时想不到做法。T3 一个变量名写错了,枚举 \(S\) 用成了 \(all\),又亏了 \(45\) 分!!!
其实我的分数应该是 \(100 + 55 + 45 + 0 = 200\) 的。。。我丢的分比我得的分多。
只有 zxh 和 Air 过了 T1,都比我们分数高,获得了 qy 奖励的枪。
想了想,这次时间分配还算合理(毕竟真的会 T1 了),感觉还是赛时静不下心,导致细节错了好多。
补完了四道题。T3 只有换根没有 DP。T4 是同余最短路。
9.7 模拟赛总结
这次是校 oj 的 jsy 模拟赛。怎么只有三道题。
8:00 开赛。这把比赛的时间分配极度不合理,因为我又死磕上 T1 了。想了快一个小时,终于迈出了第一步:余音值至少是一个元素第一次和最后一次出现的坐标差。先假设恰好就是这个坐标差(赛后得知就是这样的)。那么就让同一元素尽可能集中。称一个元素 \(x\) 第一次和最后一次出现的位置分别是 \(fir_x, lst_x\),令 \(len = \max(lst_x - fir_x)\) 表示目前已知序列的余音值。考虑到 \(fir_x \sim lst_x\) 的所有 \(0\) 都可以改为 \(x\),不影响余音值。现在剩下了一些 \(0\)。令 \(f_i\) 表示位置 \(i\) 左边的最大的 \(fir_x\),\(g_i\) 表示位置 \(i\) 右边的最小的 \(lst_x\)。贪心地让为 \(0\) 的位置 \(i\) 按 \(min(i - f_i, g_i - i)\) 从大到小排序。从大到小看,对于较大者,若 \(min(i - f_i, g_i - i) > len\),即不管怎么选都会让余音值更大,那就赋为新值(指全局没出现过的值),并让其周围长为 \(len\) 的 \(0\) 都赋为这个新值(使得不影响余音值)。直到新值用完,对于剩下较小者,即使还会让余音值变大,也已经尽力了,余音值已经是最小的那个了,因此直接选择 \(i - f_i\) 和 \(g_i - i\) 中更小的那个对应的元素。
赛后知道为啥错了。样例:\(n = 8, k = 2, a = 0\ 0\ 1\ 2\ 1\ 0\ 0\ 0\)。我会让它变成 \(2\ 2\ 1\ 2\ 1\ 2\ 2\ 2\)。这里有两个错误:
-
局部贪心不代表全局最优。贪心地让 \(a_2 = 2\),固然在局部最优,但是会影响以后的值。
-
\(f_i, g_i\) 是动态的。修改 \(a_2\) 后,元素 \(2\) 的左端点变成了 \(2\),\(f_6\) 从 \(fir_2 = 4\) 变成了 \(fir_1 = 5\),这会影响之后的赋值。
综上所述,我根本不知道这个思路咋改能对。贪心假完了。正解是二分。
赛时没想那么多,因为看着周围的人都过了 T1,就越来越急躁,一直改来改去,最后一次提交在 11:36(是的你没看错,我写了三个半小时),获得了 \(52\) 分的好成绩。然后果断放弃,去写 T2。
肯定是写暴力了。\(O(n^2 \log n^2)\) 是好做的,建反图跑 Dijkstra 即可。\(m < n - 1\) 的性质也容易想到(虽然题上给的是 \(2m < n\),但是差不多),因为此时图必然联通,一个点到另一个点要么有直接连边,要么必然通过一个中间点到达,点距为 \(1\) 的有 \(\frac{n(n - 1)}{2} - m\) 对,为 \(2\) 的有 \(m\) 对,其余没有。11:55 提交,得分 \(52\) 分。
我还有五分钟时间。我飞速阅读 T3。我立刻观察数据。我精准发现有 \(m = 1\) 的性质。我很快想到只有一种情况,答案为 \(n\)。我迅速敲完代码。11:57:56 提交。\(0\) 分。我再次思考,并予以认同。我发现我只读入了 \(n\)。我光速写完读入。11:59:27 提交。还是 \(0\) 分。我仔细检查代码。我注意到没换行。11:59:50 提交。\(8\) 分!
出榜了。怎么都过 T1 了。我是倒数第二。T3 竟然是原题,而且我写过题解,可惜我只有 \(5\) 分钟。
我并不知道我为什么要死磕 T1。我可能是疯了。目前订完了 T1(二分答案)和 T3(期望 DP)。
T1 我把题解微调了一下,似乎更易懂了,如下:

另一个好玩的事,过 T1 的人是因为校 oj 数据太水了,连 \(O(n^2)\) 的都放过去了,交到 qoj 原题上没一个过的。这下心理平衡了。
9.8 模拟赛总结
代码源 CSP-S 模拟赛 Day 3。
Air 并没有来,lzf 说他昨晚被 zwq 的呼噜吵醒了没睡好,但是我觉得我今天状态怪好的,即使洛谷运势大凶。
我在想一个事情,就是死磕 T1 是不是对的呢?如果死磕 T1 没磕出来,总分就不可能上二百分,直接就退役了;但是如果不死磕 T1 而是把暴力分数拿满,似乎也很难过队线。那么今天的策略还是死磕 T1。
7:41 开赛。四道题目的名称分别是四个表情包 🧶🔴🐺🐑。先跑去看 T1 了。第一眼想直接暴力 \(O(n^2)\),发现好像连这个都不会。第二眼想到 trie 树,每个点都能记录 \(cnt\) 为经过它的串数,然后怎么转化到 \(f(i, j)\) 呢???
忽然来了点小巧思。大概想了以下内容:
钦定 trie 树根节点为第 0 层。设 g[i] 表示第 i 层的最大 cnt。显然 g[i] 是单调不上升的。insert 字符串时可以修改 g[i]。
然后考虑 f(j) = 满足 g[i] >= j 的最大 i。
考虑一段相同的 g[i],取最大的 i 必然更优。可以用 set 记录这样的相同段的右端点:R = {r_1, r_2, ..., r_k = max|S|}。
显然,k <= min(n, max|S|)。
和 insert 一起做,每次 g[i] 变化时,最多在 R 中添加、删除一个数,这部分时间复杂度 O(max|S| \log max|S|)。
钦定 r_{k + 1} = 1000001, g[1000001] = 0。
则,对于 i = 1 ~ k,满足 g[r_{i + 1}] < j <= g[r_i] 的 j 贡献 r_i xor j。
总贡献为:\sum\limits_{i = 1}^{k} \sum\limits_{j = g[r_{i + 1}] + 1}^{g[r_i]} r_i xor j。
求答案的时间复杂度 O(n)。总时间复杂度 O(max|S| \log max|S| + n^2)。
8:40 左右。我终于会 \(O(n^2)\) 了。我不准备写因为没有前途。这时候我觉得要炸了。稳住啊,看 T2,前缀和一下,然后 \(O(n^2)\) 的 DP 是好做的,那剩下的就是 DP 优化了。转到二维平面,就是从左下角转移过来,但是没什么想法啊。忽然又来了小巧思,前人说过:当你遇到不可做的问题,升维就好了。于是添加了 \(i\) 这一维,惊奇地发现可以 CDQ 分治!后面又看了看 T3,\(O(2^n)\) 显然,子任务二也显然。
9:20 左右回到 T1,迈出了人类历史上及其关键的一步:我想到了二进制拆位求贡献!大概如下:
只能对求答案部分优化。每次只可能令 g[0 ~ |S|] 增加 1,那么对于 r_i > |S| 的 i,贡献是不变的。
考虑只对 r_i <= |S| 的重新求,最多有 |S| 个。对每个 r_i 二进制分解。
第 x 位为 1:查找 g[r_{i + 1}] + 1 ~ g[r_i] 中,第 x 位为 0 的数量。
第 x 位为 0:查找 g[r_{i + 1}] + 1 ~ g[r_i] 中,第 x 位为 1 的数量。
可以预处理!因此对 r_i 单次求答案的时间复杂度 O(\log |S|),求答案的时间复杂度 O(|S|\log |S|)。
总时间复杂度 O(max|S| \log max|S| + \sum |S|\log |S|)。
我做到了!我成功将 \(O(n^2)\) 优化成了 \(O(\sum |S|\log |S|)\)!
10:19 提交 T1。中间脑子有点混沌,而且压力有点大(因为 mxf 和 cyz 都说过 T1 了),所以写了很久,但是本题期望得分 \(100\) 分。
两个半小时过 T1 也是神了,飞速跑到 T2 写 CDQ 分治。这个是非正常版,先递归左,再求,再递归右。写的时候忘 sort 了,打表神力查出来了,又开了个结构体(多存了 \(id\))改了好一会,一直不过,发现存 o[p].dp - p 应该是 o[p].dp - o[p].id。不知道我怎么发现的,但是改完后就对了,大样例跑了 2s,看来是过不了 \(2\times 10^6\) 的数据了,但是 \(2\times 10^5\) 的 \(O(n\log^2 n)\) 是可过的。
11:07 提交 T2,本体期望得分 \(60\) 分。中间担心 T1 超时,把 #define int long long 去了,只开特定的 long long。
T3 显然是开不了了,很快写完 \(O(2^n)\) 和子任务二。发现读假题了,狼人不能相邻,而且狼人的话都不可信,所以重写了一下。发现不会子任务二了。
11:29 提交 T3,期望得分 \(10\) 分。看到 T4 的第一眼就知道暴力都没有希望了。于是就等到 11:41 出分,中间又检查了 T1、T2 有没有犯糖,似乎没啥问题。
11:41 出成绩:\(100 + 60 + 10 + 0 = 170\)。竟然没有挂分。后面都陆续出分了,zwq 不让看。zxh \(130\) 分,T3 挂了 \(10\) 分。lzf \(140\) 分,并没有挂分。mxf \(160\) 分,T4 挂了 \(30\) 分。cyz \(135\) 分,T2 挂了 \(60\) 分。Air \(155\) 分,T1 挂了 \(60\) 分(他为什么要写哈希啊这肯定被卡吧)。mxf,cyz 和 Air 不挂分都比我高,可是我莫名其妙就第一了。我认为我这个是假的第一。
T2 原来可以搞成二维偏序啊,若 \(X_r > X_l, Y_r > Y_l\) 则 \(r\) 能继续扩展。这我真没想到。最后必然有一个是相等,基于相等的值,只需要对另外一个值搞一个树状数组就行。但是树状数组空间会炸,需要离散化并用 vector,总空间 \(O(n)\)。
T3 可以用 DDP,但是我觉得太麻烦了,理解了一下题解,写起来不难,主要是赛时挺难想到 s[i] 这一步。以下是注释:
设狼人数量为 K,dp[i] 表示 i 为村民是否可行。假设 i 为村民,上一个村民 j = i - 1 或 i - 2,j ~ i 中间的狼人数量 t = i - j - 1。
满足 dp[j] = 1,且:
'L' -> 'L': b[i] - b[j] = t.
'R' -> 'R': b[j] - b[i] = t.
'L' -> 'R': b[j] + b[i] + t = K.
'R' -> 'L': b[j] + b[i] - t = K.
则 dp[i] = 1。
枚举 K,钦定 0 和 n + 1 为村民,b[0] = 0, d[0] = 'L', b[n + 1] = 0, d[n + 1] = 'R'。
初值 dp[0] = 1,若 dp[n + 1] = 1,则倒着 DP,求任一合法 j 皆可。
时间复杂度 O(n^2)。考虑优化,s[i] 表示若 i 为村民,可行的狼人数量的集合。初值 s[0] 为全集。
若满足前两条,则 s[i] 放入 s[j];若满足后两条,且 s[j] 含相应的 K,则 s[i] 放入 K。
可以证明,s[i] 必然是全集或常数个。因此存储:bool flag(是否为全集),set<int> K(若不是全集,有什么 K)。
T4 据 Air 所说很难写,就先放着了。
9.10 模拟赛总结
代码源 CSP-S 模拟赛 Day 4。
又到周四了,你代码源叔叔每周最阴的一场。提前开赛的 zwq 告诉我 T1 要求一个 \(O(n^2)\) 的式子,但是 \(n\) 是 \(5000\),我寻思暴力不过了吗,结果式子是 \(\varphi\)???想了会没思路。
7:53 开赛。T1 求 \(\sum\limits_{i = 1}^n \sum\limits_{j = i}^n \varphi(a_i + a_j)\),忘了 \(\varphi\) 的公式了,(以下 \(p\) 为质数)想到 \(\varphi(p) = p - 1, \varphi(p^k) = p^k \times \frac{p - 1}{p}, \varphi(n \times m) = \varphi(n) \times \varphi(m)(\gcd(n, m) = 1)\),然后就推出来 \(\varphi(x) = x \times \prod\limits_{p | x} \frac{p - 1}{p}\)。嗯?直接质因数分解不就做完了吗?
然后就是写写写,写一半发现时间复杂度假了,根本不能 \(O(\log n)\) 地质因数分解,至少也得枚举 \(1 \sim \sqrt{2 \times 10^9}\) 的质数,那不炸了吗。
9:04 提交 T1,时间复杂度 \(O(n^2 \sqrt{2 \times 10^9})\),以及特殊性质的 \(O(n^2 + 2 \times 10^7)\),期望得分 \(60\) 分。
去看 T2。猜测按左端点排序,找到排序后的一对相邻线段 \((line_i, line_{i + 1})\),满足其围成部分包含查询的点 \((x, y)\),则答案就在 \(i - k \sim i + 1 + k\) 里面,观察数据范围可以验证猜想。求答案是 \(O(qk)\) 的,没啥问题,主要是如何找到 \(i\),并没有什么好想法,猜测应该是左端点离 \(y\) 最近的线段,二分即可。写写写。这个分数输出是真恶心,还得写结构体,写分数加减乘除比大小。
10:00 左右,发现思路假了,过不了 \(k = 0\) 的大样例,因为线段左右端点分别是:\((0, 99), (1, 100), ..., (99, 198), (100, 199)\),查询点 \((T, 99)\) 时,二分出来的是 \((99, 198), (100, 199)\) 这两条线段,但它们围成部分不包含该点,应该是 \((0, 99), (1, 100)\)。
后面又尝试将相邻线段按照交点 \(y\) 坐标排序并二分,但是还是假。我不会了。顺便看了看 T3、T4,感觉暴力都是会的,留一点时间就行,所以后面又尝试了很久 T1、T2,都没有什么结果。按理来说这时我应该去写后面的暴力,但是我还是想赌万一会了呢。
10:29 提交 T2(原来的版本),期望得分 \(0\) 分。我觉得会被子任务卡死。
11:00 左右来到 T3。\(O(n^2)\) 建图是好做的,那么维护一个连通块,限制就是每加一个点需要它和之前的连通块仍然连通。但是要求方案数,应该是 DP 一类的,想不到怎么设状态,似乎离不开 \(2^n\),因此放弃建图。后面又想会不会是区间 DP,维护目前的区间,但是并不知道放了哪些区间,这个维护起来还是 \(2^n\),放弃了。写了个最暴力的 \(O(2^n)\) 的 DP。
11:41 提交 T3,期望得分 \(10\) 分。T4 依旧是没空写的,不过 \(O(n3^n)\) 暴力写完了,其实本来想写暴搜+剪枝,听 lzf 说有 \(40\) 分,但是没时间了。
11:52 提交 T4,期望得分 \(10\) 分。竟然就剩一分钟了,不过没有之前最后十秒提交上的惊险。
11:53 出成绩:\(60 + 30 + 10 + 10 = 110\)。不仅没挂分,还多偷了 T2 的 \(30\) 分,即使我都不知道咋过的。拿下了除 Air 外的最高分。
听 Air 讲了讲 T1,原来 T1 之所以要求 \(\varphi(a_i + a_j)\) 而不是 \(n^2\) 个数的 \(\varphi\) 是有原因的,可以枚举质数 \(p\),然后枚举 \(a_i\),将 \(a_i\) 放到 \(a_i \bmod p\) 的桶里,和它匹配的 \(a_j\) 应处于 \((p - a_i \bmod p) \bmod p\) 的桶里。那么,就可以对每个 \((i, j)\) 记录 \(a_i + a_j\) 的质因数,最多九个。
然而订的不是很顺利,Air 说很好写,但是他写法和我上面说的不一样。我都用 vector,结果爆空间了,改用数组的话,需要开 \(O(10n^2)\) 的数组记录 \(a_i + a_j\) 的质因数数量与是谁,以及开 \(O(n \times \max p)\) 的数组记录余数的桶内元素。这显然会爆空间。注意到余数只会用到 \(O(2n)\) 个,可以映射到 \(1 \sim 2n\),那么总空间复杂度约为 \(O(10n^2 + 2n^2) = O(12n^2) \approx 1144MB\),炸了!
注意到 \(n \le 5000, p \le 44722\),因此可以把 int 开成 unsigned short,就卡过了。写起来很恶心。
T2 发现和正解差了两步:
-
第一是如何找到 \(i\),只需要找到一个位置 \(line_i\) 满足其在 \(x\) 处低于 \(y\),\(line_{i + 1}\) 在 \(x\) 处高于 \(y\)。根据介值定理,直接二分就可以,若 \(line_{mid}\) 在下方则令 \(l = mid + 1\),否则令 \(r = mid\),最后 \(l = r\) 即为 \(i + 1\)。
-
第二是,并不是上下 \(k\) 条线段,而是上下 \(2k\) 条,原因如下:
![image]()
黑点为 \((x, y)\)。可以发现,上面 \(k\) 条线段与上面 \(k + 1\sim 2k\) 条线段相交。
T3、T4 还没订。
9.12 模拟赛总结
代码源 CSP-S 模拟赛 Day 5。本次打的又爽又不爽的。
起床起晚了,8:18 开赛。T1 询问对排列反转一个区间后的全局逆序对数最大值,显然只有区间内部的逆序对与顺序对互换,其余不变,需求区间内部的逆序对数。设 \(f[p][l]\) 表示 \(p\) 在 \(1 \sim l\) 里的逆序对数,\(O(n^2)\)。枚举 \(l\),向右扩展 \(r\),得到 \(r\) 在 \(l \sim r\) 里的逆序对数:\(f[r][r] - f[r][l - 1]\),\(O(n^2)\)。这么简单吗?
8:41 提交 T1,期望得分 \(100\) 分。此时并没有乐观到哪里,因为感觉 T1 是人均。至少得开个 T2。
首先,不难发现有解的必要条件是 \(a[i] \le i\),不清楚是不是充分条件。思考全是 \(1\),容易想到,保留第二位为 \(1\),钦定第 \(3 \sim n\) 位依次为 \(2 \sim n - 1\),可以通过选择第二位的 \(1\),使得第一位达到任意值,就可以随意修改后续值。
之后就往连续段方面想了,但是感觉和连续段没什么关系,因为并不是所有连续段都可以类似如上操作。中间又往区间压缩方面想,认为找到最小的 \(st\) 使得 \(1 \sim st - 1\) 都满足 \(s_i = i\),而 \(s_{st} < st\),同理找到最大的 \(ed\),可以得到 \(s_{st} = st - 1\),保留第 \(st\) 位为 \(st - 1\),钦定 \(st + 1 \sim ed\) 类似上述操作。然而假了,因为可能在 \(st + 1 \sim ed\) 中有 \(a_i = i\)。
忽然灵光一现,既然遇到 \(a_i = i\) 的,那么至少 \(st + 1 \sim i - 1\) 是填好了的,令 \(st - 1\) 最终填到 \(i - 1\),然后这个 \(st\) 就失效了,找下一个 \(st\) 即可。
10:04 提交 T2,期望得分 \(100\) 分。此时仍然不乐观,因为感觉 T2 也很人均。尝试开 T3。
\(O(nq)\) 的 DP 是好做的,设 \(f[u], g[u], h[u]\) 分别表示 “父亲不选 \(3\)”“父亲不选 \(3\),\(u\) 选 \(3\)”“父亲选 \(3\)”时的子树最大价值,容易转移。但是必须和 \(l\) 有关。想不到怎么优化了,猜测是离线 \(l\) 并排序,但是感觉更新某一层的 DP 值,会修改上方的所有 DP,不知道怎么办了。
11:11 提交 T3,期望得分 \(70\) 分。接下来的一个小时,就是疯狂想优化 T3 和思考 T4。感觉 T3 很像 DDP,但是我没太学过,就放弃了。
12:13 提交 T4。最后啥都没想出来,写了 \(5\) 分暴力,期望得分 \(5\) 分。
12:18 出成绩:\(100 + 100 + 60 + 5 = 265\) 分。T2 挂了 \(10\) 分,这时我才想起来那是个性质分,不是暴力分。然后我就注意到那个性质了,\(w = 1\),直接选择 \(m\) 即可。以及当 \(l = n\) 时,选择 \(max(m, w)\) 即可。这启发我似乎都是 \(max(m, w)\)?猜测 \(dep[u] < l\) 的点 \(u\) 必然是选择 \(1\) 和 \(2\) 中更优的 \(\max(m[u], w[u])\),因为它们选择 \(3\) 不会对周围点产生影响,其儿子仍然满足 \(dep \le l\)。
至于 \(dep[u] = l\),由于它们可以视为父亲选 \(3\),因此贡献为 \(h[u]\)。可以将 \(l\) 离线排序。
T4 看到如此长的题解,先不订了吧。
9.14 模拟赛总结
校 oj 的 qy 模拟赛。依旧三道题,据说是去掉 NOIP T1 签到。这真的是签到吗。
8:00 准时开赛,校 oj 就是喜欢出 EGOI 的题。交换相邻元素最少次数使得前 \(F\) 个元素之和至少为 \(T\)。cyz 说他秒了,而我还在观察 \(a_i \le 1\) 的大样例。首先觉得可能是离 \(F\) 右边最近的 \(1\) 移动到左边最近的 \(0\) 处,\(0\) 移动到 \(F + 1\) 处。但是假了。然后又尝试将左边 \(x\) 个 \(0\) 移动到 \([F - x + 1, F]\),右边 \(x\) 个 \(1\) 移动到 \([F + 1, F + x]\)。然后它们交换位置,这点最优为 \(x^2\) 次。发现符合这个大样例。这里已经过了快 \(40\) 分钟了,已经不敢再模拟其他样例,开始思考正解。
考虑 DP,设 \(f_{len, x, t}\) 表示区间 \([F - len + 1, F]\),选择 \(x\) 个元素移至最右端,操作次数为 \(t\),的数字和最小值,\(g_{len, x, t}\) 表示区间 \([F + 1, F + len]\),选择 \(x\) 个元素移至最左端,操作次数为 \(t\),的数字和最大值。
状态数很多,大概是 \(n^4\) 级别,但是对于 \(f\) 而言,\(len\) 的范围是 \(1 \sim F\),\(x\) 的范围是 \(1 \sim len\),\(t\) 的范围是 \(0 \sim x \times (len - x)\)。猜测常数极小,取 \(n = 100, F = 50\) 时竟然只有 \(2.7 \times 10^5\) 级别,甚至常数小于 \(\frac 1n\)?
转移是 \(O(1)\) 级别的,要么不选择当前这个,要么选择。
然后就是求答案,我认为应该满足单调性,所以尝试二分总次数 \(t\),然后 \(check\) 时枚举 \(x\),则左右移动的总次数为 \(t - x^2\)。枚举左边用到次数 \(lt\),则右边次数 \(rt = t - x^2 - lt\),若 \(sum - f_{m, x, lt} + g_{n - m, x, rt} \ge T\),则返回 \(1\);若不存在,返回 \(0\)。这样,单次 \(check\) 是 \(O(n^3)\) 的,总时间复杂度 \(O(n^3 \log n^2)\)。
9:25 提交 T1,得分 \(6\) 分。测大样例,竟然错了,发现竟然不满足单调性!!!其实是可以修改 DP 使其符合单调性,但是我比较懒,直接扔掉二分,暴力枚举 \(t\) 并 \(check\)。理论时间复杂度 \(O(n^5)\),但常数极小,大概是 \(\frac{1}{n^2}\) 级别的。然而还是错错错,最后打表发现,上述更新用到那些状态,所以我只对它们初始化了,但是求答案会用到一些其他状态。于是我直接 memset 了,通过全部大样例。
10:25 提交 T1,得分 \(100\) 分。搞笑的是,cyz 说他下班了。赛后得知此时他已经切掉前两题,并获得 T3 的 \(60\) 分。吓哭了。mxf 也早就过了 T1 并做出 T2 的 \(O(n^2)\),拿下 \(61\) 分。
T2 还是观察性质,\(D_i = 0\) 非常关键。猜测了一些结论,由于只有取 \(\min\) 操作,枚举 \(i\),钦定 \(i\) 选择 \(A\) 且有效,即到达此处的 \(A \ge l[i]\),则 \(l[j] < l[i]\) 的都选择 \(B\),剩下的都选择 \(A\)。直接做是 \(O(n^2)\) 的,并没有想到什么优化。
然后就是写写写,11:53 提交 T2,得分 \(14\) 分,也就是 \(D_i = 0\) 的 \(n^2\) 做法部分分。
12:00 结束比赛,最终得分 \(100 + 14 + 0 = 114\) 分,被打爆了,cyz \(260\) 分,mxf \(180\) 分,zxh \(146\) 分。全世界都把我打爆了。
感觉还是 T1 花了太久,我犯了两个很糖的错误,但是却调了一个小时,其实想的并不久。T2 赛后得知可以按 \(l[i]\) 排序,\(i\) 前面的都选择 \(B\),取 \(\min r[j]\),\(i\) 及后面的都选择 \(A\),取 \(l[i]\)。同时,可能不存在 \(i\),即 \(A\) 为 \(a\),此时 \(l[j] < a\) 的都选择 \(B\),剩下的都选择 \(A\)。可以认为,\(i = n + 1\)。
然后考虑一般情况,令 \(s[i]\) 表示 \(d[i]\) 后缀和,同理,\(l[j] + s[j + 1] - s[i + 1] < l[i]\) 的都选择 \(B\),剩下的都选择 \(A\)。
令 \(l[i]\) 变成 \(l[i] + s[i + 1]\),则仍然是 \(l[j] < l[i]\)。同时,\(A\) 为 \(a\) 时,也要加上 \(s[1]\),故令 \(a, b\) 变成 \(a + s[1], b + s[1]\)。
T3 竟然是黑题!而且我甚至看不懂题解!cyz 是怎么得到 \(60\) 分的,我看完题解也只会 \(O(n^3)\)。
9.15 模拟赛总结
代码源 CSP-S 模拟赛 Day 6。
7:44 开赛。总结二机房规律:第一个小时装菜不会 T1,第二个小时觉得爆零,第三个小时摆烂,第四个小时 T1 成人均。
T1 很难,以下是赛时思路:
先对 S 消消消,得到不能消的新字符串 T(即性质 C),必然是对 T 翻转区间。若为 [l, r],必须得消掉至少一端。
令 len = r - l + 1, m = T.size(),需要 m 为偶数。令 R 为将 T 整体翻转得到的字符串。
若只消掉 l,则需:
- l = m / 2 + 1, l <= r <= m。
- T[l - 1] = T[r], T[l - 2] = T[r - 1], ..., T[l - len] = T[l] -> T[l-len ~ l-1] = T[l~r]。
- T[l - len - 1] = T[r + 1], T[l - len - 2] = T[r + 2], ..., T[1] = T[m] -> T[1 ~ l-len-1] = R[1 ~ l-len-1]。
若只消掉 r,则需:
- r = m / 2, 1 <= l <= r。
- T[r + 1] = T[l], T[r + 2] = T[l + 1], ..., T[r + len] = T[r] -> T[r+1 ~ r+len] = T[l ~ r]。
- T[r + len + 1] = T[l - 1], T[r + len + 2] = T[l - 2], ..., T[m] = T[1] -> T[1 ~ l-1] = R[1 ~ l-1]。
若可以消掉 l, r,则需:
- i = m / 2 - l + 1,把 [l + i, r] 给左边消除,把 [l, l + i - 1] 给右边消除,剩余的两边消除。具体来说:
- T[l - 1] = T[r], T[l - 2] = T[r - 1], ..., T[l - (r - (l + i) + 1)] = T[l + i] -> T[l-(r-(l+i)+1) ~ l-1] = T[l+i ~ r]。
- T[r + 1] = T[l], T[r + 2] = T[l + 1], ..., T[r + i] = T[l + i - 1] -> T[l ~ l+i-1] = T[r+1 ~ r+i]。
- T[l - (r - (l + i) + 1) - 1] = T[r + i + 1], ..., T[1] = T[m] -> T[1 ~ l-r+m/2-1] = R[1 ~ l-r+m/2-1]
这是很糖的推式子部分。而且它甚至是 \(O(n^2)\) 的,糖丸了。就这个我推了一个多小时。
然后发现并不需要这么麻烦,可以直接做,两边的必须相同,不断往中间压缩,判断中间的左右两部分是否相同就行了。写了个双哈希。
10:38 提交 T1,期望得分 \(100\) 分。应该不会被卡吧。然后看了看 T2, T3,都不是很好写,T2 暴力应该是可以的,所以先搁着了,去写 T4。
T4 暴力分巨多,\(O(n^2 \log n)\) 是好做的,往 set 里塞每个数字首次位置和末次位置,取前者最大值和后者最小值,判断区间是否合法。性质分也很多,至少 \(k \le 2\) 和 \(A, B\) 性质都好做。
11:39 提交 T4,期望得分 \(50\) 分。然后忘了还有 T2 了,就干坐着。
忽然想起来还有 T2 暴力没写,也不写了,猜测性质,11:42 写个 \((n - 1)!\) 交上去。
11:44 出成绩:\(100 + 16 + 0 + 45 = 161\),T4 挂了五分,笑点解析:

T2 出的很好啊,这个树形 DP 真神了。T3,T4 没订。
9.16 模拟赛总结
jsy 模拟赛太阴了。为什么 T2 是人均啊。
T1 最阴的来了。

请注意,不是 \(n + m\),是 \(n \cdot m\)。所以 \(n(n - 1) \le n \cdot m \le 5 \times 10^6\),\(n \le 2500\)。故可以 \(O(n^2)\)。
那还说啥呀,从大到小扩展必然是更优的,因为如果先扩展小的会丢失大的值。大根堆存 \(\{a_i, i\}\),BFS 扩展即可。
T2 更阴的来了。
-
长官,这些地方是泉眼,能否从 \(A\) 到达 \(B\)?
-
不可以。
-
长官,泉眼换地点了,能否从 \(A\) 到达 \(B\)?
-
不可以。
-
长官……
-
不可以。
-
为什么你总是回答不可以?
-
因为我比较笨,不会回答你的问题,但我知道,回答不可以回答正确的概率是 \(56\%\)。

Air 和 cyz 都过了,zxh, mzf, lzf 也都有思路。我成最菜的了。
zxh 过了,其他人到最后也没过。
T3 有阶乘就有状压,写了点状压写了点 \(A\) 性质,拿下 \(36\) 分。T4 \(O(n2^mm!)\) 竟然也有分吗,以及 \(A\) 性质,拿下 \(32\) 分。
Air 中途被踢出比赛了,就摆烂了,我也是超越了一次 Air。
赛后订 T2,怎么是 \(64\) 分,查不出来了。
9.17 模拟赛总结
代码源 CSP-S 模拟赛 Day 7。
7:54 开赛。四道题名字都是什么什么猜想、什么什么方程,神秘极了。T1 是 Air 所说的板子题,可是我没做过类似的。我要爆零了吗。
T1 一开始以为是贪心,没什么想法,开始推式子,竟然碰巧蒙对了,思路:
数组都为环状,下标对 n 取模。构造操作次数 b,使得 a[i] = \sum\limits_{j = i - k + 1}^{i} b[j]。
我认为充要条件同时满足:a[i] - a[i - 1] = b[i] - b[i - k] and \sum b[i] = (\sum a[i]) / k。因此 k 需要整除 \sum a[i]。
公差为 g = gcd(n, k),确定 b[0 ~ g - 1] 即可确定全部。有 g 组环,编号为 0 ~ g - 1,环长都为 n / g。
设第 t 个环首 b[t] = x_t,可以确定环内全部元素,列出 \sum b[i] = (\sum a[i]) / k 的 t 元一次方程,求 \sum c[i] * b[i] 最小值。
根据环长相同,可得 x_t 的系数都是 n / g,从而得到 \sum x_t。
每个 b[i] 是 x_t 加上某个常数,那么常数 * c[i] 是定值,求 \sum (\sum c[i]) * x_t 的最小值。
直接贪心地给 \sum c[i] 最小的,让它的 x_t = \sum x_t,其他 x_t = 0 即可。
9:00 左右就会了,写了半小时,挂了大样例。打表发现不能直接把所有 \(\sum x_t\) 分给 \(\sum c[i]\) 最小的那个,因为其他 \(x_t\) 还有限制,必须保证环内元素非负,即每个 \(x_t + 常数\) 非负。限制下界即可,也是好做的。
10:22 提交 T1,期望得分 \(100\) 分。后面的题巨难无比,Air 说它 all in T2,没 in 出来。
那我就写点暴力吧,T2 的 \(n \le 5\) 和 \(k \le 2\) 都是好做的,Z 函数板子。T3 的 \(O(n^2 q)\) 也是好做的。期望得分都是 \(20\) 分。
此时 11:31,准备写 T4 暴力。本来想写阶乘改状压,但是认为没时间了,就写了个阶乘做法。但是没调出来。最后只好提交性质分,求有根树拓扑序数量,公式是 \(\frac{n!}{\prod sz_u}\)。期望得分 \(5\) 分。
11:54 出成绩:\(100 + 20 + 20 + 5 = 145\)。Air 说他 T2 思路没错,后面他写了篇题解,我看懂了并订了。我居然拿到了第 \(50\) 名。
9.20 模拟赛总结
代码源 CSP-S 模拟赛 Day 8。昨天打 csp-s 初赛了,所以比赛延期到今天。初赛估分 83 分,有过的风险吗。
7:56 开赛。T1 二十分钟想到了 \(O(n^2)\) 的 DP,然而 cyz 和 zxh 已经通过。一怒之下扔掉 DP,开始思考正解。发现对于第 \(i\) 个三角形,需要找到后面最近的 \(j\) 使得 \(d[i] - (j - i) \le d[j]\),那么 \(i\) 不会对 j 及之后产生影响,\(i\) 的答案就是 \(j\) 的答案加上 \(i \sim j\) 之间的梯形面积。
转化一下,就是 \(i + d[i] \le j + d[j]\),可以单调栈维护后缀的这个东西,要求递减,那么手写二分得到 \(j\) 即可。
8:44 提交 T1,期望得分 \(100\) 分。接下来是噩梦的开始,因为 T2 是贪心。已知我在 9.19 的 abc 的 D 题黄贪中拿下了 \(60 + 3 * 5\) 的罚时,这使我信心倍减。
仍然是 \(O(n^2)\) DP 起手,以及一些性质,能吃 \(65\) 分。还不够,因为 cyz, zxh, lzf, mxf 相继通过 T2 了。这就导致我的心态越来越炸,仍然想不出来 T2 正解。尝试了两三种贪心吧,也都失败了。
11:04 提交 T2,期望得分 \(65\) 分。我决定先去写暴力,剩下的留给海马体。T3 是串串,我会 \(n \le 20, |s| \le 2\) 的暴搜,和 \(n = 1\) 的 SA。但是我忘了 SA 咋写了,去学习了一下失败了,所以就先搁着了,不想和其他人一样粘模板过来,不然那不等于啥也没写吗。T4 的 \(q \le 20\) 的状压也是好做的,差分一下就很快了。
11:22 提交 T4,期望得分 \(17\) 分。我又回到 T2 了。海马体发力了,想到可以把 \(A, B\) 放一起排序。然后模拟了一下样例,感觉需要维护 \(need\) 和 \(have\) 表示目前 \(A\) 数量和 \(B\) 数量,当且仅当 \(A = B\) 时会更新总长,先走到 \(i\) 处,然后如果 \(i\) 处是 \(A\),就不用往回走了,因为之前必然一直都是 \(need < have\),肯定都是能给到的;如果是 \(B\),那么就要往回走,走到目前第一个 \(A\) 处,再走到目前最后一个 \(A\) 处。同时更新答案,是目前的总长加上走到末尾再走到 \(i\) 之后的第一个 \(A\),如果 \(i = m\) 就直接是总长了。然后让 \(need, have\) 归零。
11:50 提交 T2,期望得分 \(100\) 分。这也太压力了,我还有 T3 的暴搜没写呢。
11:56 提交 T3,没交上。哈哈哈就差了一秒钟,字面意义上的。和 9.19 的 abc 一样,也差了一秒钟没交上 F 题。
出成绩:\(100 + 100 + 0 + 17 = 217\)。好在是没掉分,如果把 T3 交上就是 \(227\) 分了。zxh 竟然也是 \(217\) 分,他 T3 写 SA 挂了,我的评价是粘模板可耻。mxf \(220\) 分,cyz \(257\) 分,怎么都比我高。最搞笑的是 lzf,T1 没写单调栈写的线段树上二分,挂成 \(25\) 分,T2 忘删 freopen 挂成 \(0\) 分,T3 想出正解但是被卡自然溢出哈希了,挂成 \(25\) 分,T4 太紧张一份代码粘了两边 CE,挂成 \(0\) 分。
lzf 讲了讲 T3,我听懂了并订了订。并不需要 SA。倒着求答案,设 \(i + 1 \sim n\) 的答案串为 \(ans\),先把 \(s_i\) 加到 \(ans\) 后面,并求出哈希,然后考虑找到最优下标 \(pos\) 使得 \(ans\) 以 \(pos\) 结尾的前缀从后往前的字典序最小。把 \(pos\) 后面的扔了。求 \(pos\) 可以二分哈希做,比较原本最优下标 \(pos\) 和被比较下标 \(com\),二分出以它们结尾的前缀的最长公共后缀,比较前一位即可。
9.21 模拟赛总结
jsy 模拟赛。四道题,竟然是真的 NOIP 模拟赛。炸了。
T1 不会。思考了近乎三个小时还是不会。在 11:20 提交 T1,只写了状压和性质分,期望得分 \(28\) 分。
T2 很容易想到枚举区间判断合法,合法即满足区间内的所有颜色都只在区间内出现。可以预处理每种颜色的最左边和最右边的位置 \(l, r\),倍增求区间内所有颜色的最小 \(l\) 和最大 \(r\)。然后考虑一段区间的左端点必然是一种颜色的 \(l\),枚举它并令区间右端点为该颜色的 \(r\),若区间最小 \(l\) 小于左端点则结束,若区间最大 \(r\) 大于右端点则令右端点等于它。这样一直跳,复杂度很玄学,是 \(O(n \sim n^2)\) 的。性质分也很好写。
11:48 提交 T2,期望得分 \(56 \sim 84\) 分。并没有写 T3, T4 的暴力。
12:00 出成绩:\(28 + 88 + 0 + 0 = 116\) 分。
T1 是结论题???一万个人过了???就是朴素 DP,如果 \(j + 1 \sim i\) 有 border 就不能转移,会计重,否则 \(dp_i \leftarrow dp_j\)。
我其实想到了 border,但是没想到有 border 的直接不要了?我还以为是要去掉 border 求中间一部分的区间 DP 呢。这也太人品了。
T2 有非常简单明了的异或哈希做法。给所有颜色赋随机哈希,使得同色的异或和为零。那么区间合法就是区间异或和为零了。
T3 由于要求连通块内有至多两种颜色,可以设 \(dp_{u, c}\) 表示以 \(u\) 为根的子树内,除了 \(a_u\) 的另一种颜色为 \(c\) 的方案数。当 \(c = a_u\) 时表示只有一种颜色。然后就是 \(O(n^2)\) 转移,若 \(a_u \ne a_v\) 就只修改 \(dp_{u, a_v}\),否则修改全部。
if(a[u] != a[v]){
int A= dp[u][a[u]], B = dp[u][a[v]];
int C = dp[v][a[v]], D = dp[v][a[u]];
ADD(dp[u][a[v]], (A + B) * (C + D) % mod);
}
else{
int A = dp[u][a[u]], B = dp[v][a[v]];
for(int x = 1; x <= n; x++) if(x ^ a[u]){
int U = dp[u][x], V = dp[v][x];
dp[u][x] = (U * (1 + V + B) + A * V) % mod;
}
dp[u][a[u]] = A * (1 + B) % mod;
}
你会发现可以用线段树合并来优化它。\(a_u \ne a_v\) 就是单点修改与单点查询,\(a_u = a_v\) 就是单点查询与合并。这个竟然是黑题。记录一下 Air 第一次场切黑 %%%。
9.22 模拟赛总结
代码源 CSP-S 模拟赛 Day 9。
我竟然 8:00 整点开赛?T1 求一个串内的两个非空子串(可交)异或最大值。打表发现答案长度必然是原串去掉前缀零后的长度,也就是说必然要选择去掉前缀零的原串作为子串之一。考虑另一个子串是谁。假设第一段 \(1\) 位于 \([l_1, r_1]\),之后的第一段 \(0\) 位于 \([l_0, r_0]\)。肯定要贪心地令 \([l_0, r_0]\) 的前缀 \(1\) 数量变多,同时不能影响 \(r_0\) 之后的第一段 \(1\)。
因此,当 \(r_1 - l_1 \ge r_0 - l_0\) 时,可以把 \([l_0, r_0]\) 全变成 \(1\),那么另一个子串就要以 \(r_1 - (r_0 - l_0)\) 开头,往后一直匹配下去(使得 \([r_1 - (r_0 - l_0), r_1]\) 和 \([l_0, r_0]\) 匹配上);否则,尽可能多的匹配,那么另一个子串就要以 \(l_0\) 开头。
8:41 提交 T1,期望得分 \(100\) 分。感觉 T1 要人均了。似乎得开 T2 了。
思考了半个小时,我连最暴力的非多项式做法都不会做。随意修建新铁路肯定是要被扔掉,但是我不知道怎么扔掉它,所以连暴力都做不了。
开 T3 了。打表发现 \(f(x) = \frac{x}{2}\)。容易想到操作次数为 \(2n\) 也就是 \(4f(n)\) 的做法,就是把 \(S\) 和 \(T\) 都变成全零。考虑怎样把一个字符串变成全零,长度大于 \(2\) 的 \(1\) 段内部消,剩下单独的 \(1\) 根据 \(i - 2\) 和 \(i + 2\) 的值来看怎么操作,但是都可以 \(3\) 次消除完这三个位置上的 \(1\)。不知道操作次数,但绝对不超过 \(n\),也就是 \(2f(n)\)。后面考虑可以变成全零或全一,取最优解。
向 QY 请教了一下 SPJ 的 checker 如何使用,然后跑了一些随机数大样例,发现总操作次数是 \(2f(n)\) 级别的。这让我以为它其实是 \(2f(n)\) 的,能够获得 \(50\%\) 的分数。
保险起见,又写了些 \(n \le 10\) 的暴搜 \(20\) 分。
10:51 提交 T3,期望得分 \(20 + 80 \times 50\% = 60\) 分。
T4 模拟一下操作发现,就是有 \(n^2\) 个数 \(1 \sim n^2\),每个数都有唯一的出边,构成若干个环,求环长的 \(\operatorname{lcm}\)。
这样 \(O(n^2)\) 就好做了。
11:11 提交 T4,期望得分 \(20\) 分。剩下的性质不会了。又跑去写 T3,但是没有什么成果。
12:00 出成绩:\(100 + 0 + 36 + 0 = 136\)。T3 看来还是 \(4f(n)\) 级别的,只是随机数据下操作次数少罢了。T4 竟然爆空间了!\(5000^2\) 的数组我直接开了十个,我不炸谁炸。长记性了。
听 cyz 讲了下 T3 的 \(2f(n)\) 做法,就是考虑相邻的两段 \(1\),一次必然消除至少一段 \(1\)。
正解结果是很神经的做法?暴搜出 \(n \le 10\) 时的所有最优方案,然后大的 \(n\) 由它们拼接起来???
T2 是黑题。所以这把是青黑黑黑吗。见我的题解。
9.24 模拟赛总结
代码源 CSP-S 模拟赛 Day 10。
7:53 开赛。怎么开赛时间越来越晚了。昨天做了一道 AGC001 的 F,是个逆排列。现在看啥排列都像逆排列。巧的是,这道题我还真写出来逆排列做法了。
原本是求排列数量,满足 \(m\) 个限制:给出 \(k\) 个下标和 \(c\),要求这些位置上的数的最大值为 \(c\)。
转换成逆排列,就是 \(k\) 个数填到 \(c\) 处及左边,必须有一个数填到 \(c\) 处。
按 \(c\) 从大到小排序,考虑到了第 \(i\) 个限制时,前 \(i - 1\) 个限制的数都不能填到 \(c_{i - 1} + 1\sim c_i\) 里,剩下的没填过的数就是自由数。维护目前的自由数的集合。找出一个自由数,满足其出现在所有 \(c = c_i\) 的限制中,把它填到 \(c_i\) 处,方案数是这样的自由数的数量。剩下的位置就是随便填了,方案数是自由数集合大小。
9:13 提交 T1,期望得分 \(100\) 分。
然后搞笑的来了,T2 我证了个假结论,证明过程如下:
-
考虑三个同色块如果在一条链上,那么全局必然不合法。
-
否则,我就当这种情况不存在。
然后得出结论就是同色块至多有两个。哈哈哈哈哈哈哈……然后对着这个结论写了很久的 \(O(n^2)\),BFS 扩展。
大概写到了 11:00,大样例甚至还都通过了。
然后 T3 写了个 bitset,怎么也挂了。
T4 只有五分钟了。尝试写性质。如果 \(n = 1\) 答案为 \(0\)。否则,就是递增或递减的性质,递增应该是 \(n - 1\),递减应该是 \(0\)。
然而我太糖了,写成了 \(n\)。哈哈哈哈哈哈哈哈……
终于出分了,显然后三题都是滚木分。没有订任何题,T2 听 Air 讲了讲,但是虚树压缩我不会,就没写。
9.26 模拟赛总结
代码源 CSP-S 模拟赛 Day 11。
8:09 开赛(我来晚了哈哈哈)。T1 我真想骂它了!又是神秘结论题,猜测是相邻两个数之间插入 \(min(a_i - 1, a_{i + 1} - 1)\) 个 \(0\),最左边和最右边的空位就是 \(a_1 - 1\) 或 \(a_n - 1\)。最左边的空位不变,后面的空位要满足加上左边的空位小于中间夹着的 \(a_i\)。过大样例了???
8:29 提交 T1,期望得分 \(100\) 分。
T2 我更要骂它了!还是神秘结论题,问题是我没猜到啥结论呀?然后就摆了。赛后得知就是最长上升子序列。
T3 以下是赛事思路:
求所有集合大小之和,除以区间选择的总方案数。总方案数为 \prod (d_i + 1) * (d_i + 2) / 2,求所有集合大小之和。
拆贡献就是,枚举每个 k,求它合法的方案数,累加起来就是所有集合大小之和。
考虑知道所有区间,判断 k 是否合法。
k = 0: (\sum[l_i = 0]) = 0。
k > 0: (\sum[l_i = k]) = 0 && (\sum[l_i <= k - 1 and k <= r_i(必亮)]) <= k && (\sum[l_i > k or r_i < k - 1(必暗)]) <= n - k。
k = 0 要求每个 l_i, r_i 在 [1, d_i] 里选,方案数为 \prod d_i * (d_i + 1) / 2。
k > 0 考虑 DP。设 dp[j][a][b] 表示前 j 盏灯,(\sum[l_i <= k - 1 and k <= r_i]) = a, (\sum[l_i > k or r_i < k - 1]) = b 的方案数。
d_j < k - 1 ?
dp[j - 1][a][b] * ((d + 1) * (d + 2) / 2) -> dp[j][a][b + 1].
d_j = k - 1 ?
dp[j - 1][a][b] * k -> dp[j][a][b].
dp[j - 1][a][b] * ((k - 1) * k / 2) -> dp[j][a][b + 1].
d_j = k ?
dp[j - 1][a][b] * 1 -> illegal.
dp[j - 1][a][b] * k -> dp[j][a][b].
dp[j - 1][a][b] * k -> dp[j][a + 1][b].
dp[j - 1][a][b] * ((k - 1) * k / 2) -> dp[j][a][b + 1].
d_j > k ?
dp[j - 1][a][b] * (d - k + 1) -> illegal.
dp[j - 1][a][b] * k -> dp[j][a][b].
dp[j - 1][a][b] * k * (d - k + 1) -> dp[j][a + 1][b].
dp[j - 1][a][b] * ((k - 1) * k / 2 + (d - k) * (d - k + 1) / 2) -> dp[j][a][b + 1].
dp[j - 1][a][b] * k * (d >= k - 1) -> dp[j][a][b].
dp[j - 1][a][b] * k * (max(d, k - 1) - k + 1) -> dp[j][a + 1][b].
dp[j - 1][a][b] * ((min(d, k - 2) + 1) * (min(d, k - 2) + 2) / 2 + (max(d, k) - k) * (max(d, k) - k + 1) / 2)) -> dp[j][a][b + 1].
最终答案为 \sum dp[n][a <= k][b <= n - k]。
暴力做的话是 \(O(n^4)\) 的,也是我的赛时做法,部分分 \(30\) 分。对于 \(\max d_i \le 1\) 发现,当 \(k = 1\) 时,\(b\) 只可能是 \(0\);否则,\(a\) 只可能是 \(0\)。此时转移是 \(O(n^3)\) 的,部分分 \(15\) 分,也是我赛时的全部分数。
赛后发现 \(\max d_i \le 20\) 同理呀,当 \(k \le \max d_i\) 时暴力做;否则,\(a\) 只可能是 \(0\)。此时转移是 \(O(\max d_i n^3)\) 的,另有部分分 \(25\) 分,也是我认为我能得到的最高分 \(70\) 分。
期间先去写了一下 T4 的 \(O(nq)\) 暴力,期望得分 \(30\) 分。
11:56 提交 T3,期望得分 \(45\) 分。
最后也没有挂分。T3 正解是容斥,\(a \le k \land b \le n - k\) 的方案数,就是总方案数减 \(a > k\) 的方案数再减 \(b > n - k\) 的方案数。设 \(f[j][i]\) 表示前 \(j\) 盏灯,\(a = i\) 方案数,\(g[j][i]\) 表示前 \(j\) 盏灯,\(b = i\) 方案数。再用 \(all\) 表示总方案数。转移是类似上面的。注意所有方案都要合法。时间复杂度 \(O(n^3)\)。
T4 是神秘数论跑路了。T2 结论也是简单证了一下,似乎不难想到啊?我怎么没做出来。
9.27 模拟赛总结
jsy 模拟赛。而且好像是真的 NOIP。这把没有什么好说的好像。
8:00 开赛。T1 是博弈。先想到大部分情况都是先手必胜,考虑什么时候后手必胜呢?
打表了,容易观察到 \(n\) 是偶数且 \(L, R\) 数量相等。但是很难观察到第 \(i\) 个 \(R\) 下标要 \(\le 2i - 1\)。巧的是我观察到了,而且还过大样例了。有点不自信,又对拍了十万组,没有任何问题。
8:42 提交 T1,期望得分 \(100\) 分。
T2 跑 \(n\) 遍 KMP 的 \(O(n^2)\) 是简单的,\(s = t\) 和 \(s\) 内部相同也是简单的。
9:19 提交 T2,期望得分 \(60\) 分。这里并没有想到正解。
T3 只会写 \(O(nq)\) 和 \(L_i = 1\)。
10:09 提交 T3,期望得分 \(25\) 分。
T4 考虑每种材料作为原料只可能选择一种方案一直转化下去。DFS 枚举选择哪种方案,然后 tarjan 缩点。但是挂了,没调出来。
12:00 出成绩:\(100 + 65 + 25 + 5 = 190\)。wjx 过 T2 了,正解居然不需要 KMP。枚举长度,哈希二分判断前后缀能否通过修改至多一个字符转化。
cyz 过 T3 了。
按 \(R\) 离线排序。线段树维护 \(x_L\) 为 \([L, R]\) 答案,\(x_L\) 是单调不升的。为什么呢?若 \(l_L > 0\),则 \(L\) 对于 \(x_L\) 和 \(x_{L + 1}\) 都是不选的,此时 \(x_L = x_{L + 1}\)。否则,\(L\) 在 \(x_L\) 必选,但在 \(x_{L + 1}\) 不选。天然有 \(x_L > x_{L + 1}\),往后扫描要么就是出现 \(x_L = x_{L + 1}\),此时恒有 \(x_L = x_{L = 1}\);要么不出现,此时恒有 \(x_L > x_{L + 1}\)。
当 \(R \rightarrow R + 1\) 时,满足 \(l[R + 1] \le x_{R + 1} \le r[R + 1]\) 的 \(x_{R + 1}\) 要加一,即线段树上区间加一。查找区间左右端点,再区间加,是 \(O(n \log n)\) 的,或者线段树上二分,维护区间最值也行。
T4 可以不用图论做法???枚举 \(i\) 求 \(i\) 的答案。设 \(f[t][x]\) 表示进行至多 \(t\) 次操作,一个 \(x\) 能变成的 \(i\) 的最大数量。将 \(t\) 一维滚动掉。至多进行 \(n\) 次操作,若还能继续更新,则说明是 inf;否则直接退出循环。
9.28 模拟赛总结
十一校联考 asdfz NOIP 模拟赛。听说是他们自己出题?牛牛。
7:30 开赛。这啥题呀???哥们线段树模板都来了???思考一下多个矩形的交就是求最小上界、最大下界、最小右界、最大左界,而且还是区间修改、区间查询,上个线段树就完了。
7:54 提交 T1,期望得分 \(100\) 分。我的码速还挺快。期间被关流加 getchar 阴了一手。
T2 是期望?就是 \(m\) 个位置,每个位置有 \(n\) 种选择,求中位数的期望。规定 \(m\) 为奇数还怪好嘞。先转化为值乘方案数除以总方案数。考虑 \(O(nm)\) 枚举所有可能的中位数 \(p\),那么要求小于 \(p\) 和大于 \(p\) 的数量都不超过 \(\frac{m - 1}{2}\),等于 \(p\) 的不用管它,因为只要满足前面的条件,中间都放 \(p\),中位数就是 \(p\) 了。这样刚好不会计重。
设 \(dp_{i, x, y}\) 表示前 \(i\) 个位置,小于 \(p\) 和大于 \(p\) 的数量分别为 \(x, y\),的方案数。暴力转移是 \(O(nm^4)\) 的,设 \(l, r\) 表示第 \(i\) 个位置小于 \(p\) 的选择数和大于 \(p\) 的选择数,可以二分得到。考虑优化,之前代码源 CSP-S 模拟赛 Day 10 的 T3(就是我磕了一整场的题)用了容斥,发现本题也可以用容斥,就是总方案数 \(n^m\),减去小于 \(p\) 的数量 \(x\) 大于 \(\frac{m - 1}{2}\) 的方案数,减去大于 \(p\) 的数量 \(y\) 大于 \(\frac{m - 1}{2}\) 的方案数。为什么这样不会重复呢?因为不可能同时存在小于 \(p\) 和大于 \(p\) 的数量都大于 \(\frac{m - 1}{2}\),不然总数量就大于 \(m - 1\) 了。设 \(f_{i, x}, g_{i, y}\) 表示如上 DP,这样暴力转移就是 \(O(nm^3)\) 了。发现是个背包状物,每次转移倒叙枚举 \(x\) 或 \(y\),就可以把 \(i\) 那一维去掉,最终转移就是 \(f_x = f_{x - 1} \times l + f_x \times (n - l), g_y = g_{y - 1} \times r + g_y \times (n - r)\)。但是还是过不去。
10:09 提交 T2,期望得分 \(75\) 分。除了 \(n, m \le 100\) 可以拿到外,\(d_i = 1\) 也可以拿到,这个性质是说每个位置的 \(n\) 种选择相同,那么枚举中位数是 \(O(n)\) 的,时间复杂度 \(O(nm^2)\)。
然后就是一直卡在 T3, T4 上,没有任何思路,甚至暴力都不想敲了。感觉 T2 \(75\) 分很人均,我要垫底了。Air 说他半个小时秒了 T2???还是太强了。
11:30 出成绩:\(100 + 75 + 0 + 0 = 175\)。我怎么是除 Air 外最高的。原来都没写 T3, T4 的暴力啊,除了 zxh 大人用 \(180\) 行代码换回了 T4 的 \(4\) 分。mxf 最后几分钟会 T2 了,比赛结束后不诚实地又交了一发,但是炸空间成滚木了。
T2 竟然是退背包,其实我看出来这个 DP 是背包状物了。我的 DP 有点猎奇,和题解、Air 写的、mxf 写的都不太一样,于是只能自己琢磨了。每次 \(p\) 变成下一个 \(p\)(称为 \(np\))时,对 \(f\) 来说,只有 \(=p\) 的会从不小于 \(p\) 变成小于 \(p\),存储 \((i, cnt_p)\) 表示第 \(i\) 个位置有 \(cnt_p\) 个 \(p\),那么 \(i\) 的 \(l\) 会变成 \(l + cnt_p\),退掉 \(l\),加上 \(l + cnt_p\) 即可。由于 \(n - l\) 不可能为零(不然 \(l + cnt_p\) 就超过 \(n\) 了),直接退即可,\(f'_x = \frac{f_x - f'_{x + 1} \times l}{n - l}\)。
对 \(g\) 同理,只有 \(=np\) 的会从大于 \(p\) 变成不大于 \(p\),存储 \((i, cnt_{np})\) 表示第 \(i\) 个位置有 \(cnt_{np}\) 个 \(np\),那么 \(i\) 的 \(r\) 会变成 \(r - cnt_{np}\),退掉 \(r\),加上 \(r - cnt_{np}\) 即可。但是这里可能有 \(n - r\) 为零,只有 \(n - r\) 不为零时可以直接退,\(g'_y = \frac{g_y - g'_{y + 1} \times r}{n - r}\)。如果为零,那么 \(r = n\),原本的转移式是 \(g_y = g_{y - 1} \times r\),退就是 \(g'_y = \frac{g'_{y + 1}}{r}\),这个可以直接退因为 \(r\) 不可能为零(否则 \(r - cnt_{np}\) 就小于零了)。
然而过样例后 T 飞了,因为我有两个 DP,相当于是别人的两倍了。测了一下,发现光取模就占了时间的一半。于是上网借用快速模,终于过了。
T3 听 dhw 讲了一下。还是比较好懂的,但是差分那一块真不是人想的吧。以下是收录于塔的题解。

9.29 模拟赛总结
代码源 CSP-S 模拟赛 Day 12。
7:54 开赛。
思考了三个小时 T1,没想出来。我的组合计数能力为 \(998244353\)。
又思考了一个小时 T2,猜测与 \(2\) 的整次幂有关,不断打表,没打出来。我的构造能力为 \(10^9 + 7\)。
没有看 T3, T4。期间去录了一下学籍信息耽误了二十分钟(不过二十分钟真的有什么用吗)。
11:54 出成绩:\(0 + 0 + 0 + 0 = 0\) 分。竟然没有挂分!
T1 听 mxf 讲了讲,感觉不太懂。又听 Air 讲了讲,差不多懂了,就是:
钦定 A 道菜使用奇数份食材,称为奇数菜;B = m - A 道菜使用偶数份食材,称为偶数菜。
那么,先给奇数菜分配 A 份食材,剩余 n - A 份食材。两两一组,得到 (n - A) / 2 组,分给 m 道菜(可以为空)。
C((n - A) / 2 + m - 1, m - 1)
然后将菜分给人。先给奇数人分配 p[1] 道奇数菜,剩余 A - p[1] 道奇数菜和 B 道偶数菜。
先考虑奇数菜,两两一组,得到 (A - p[1]) / 2 组,分给 p[0] + p[1] 个人(可以为空)。
C((A - p[1]) / 2 + p[0] + p[1] - 1, p[0] + p[1] - 1)
此时形如 |--|--菜--菜--|--菜--菜--菜--菜--|...|--菜--|--菜--菜--菜--|。前面是偶数人,分配偶数道奇数菜;后面是奇数人,分配奇数道奇数菜。
然后考虑偶数菜,可以将偶数菜插入到 -- 处,数量为 p[0] + p[1] + A。即将 B 道偶数菜分配给 -- 处(可以为空)。
C(B + p[0] + p[1] + A - 1, p[0] + p[1] + A - 1)
T2 看题解发现竟然构造这么简单吗?
根据这三个式子,先得到 \(1, 2, 3, 4\),然后从 \(i = 2\) 开始依次得到 \(2^{i + 1}, 2^{i + 1} - 1, 2^{i + 1} - 2\),次数为 \(3 \log n\)。
答案为:从最高位开始,初始 \(now = 0\),对于为 \(1\) 的位置,令 \(now\) 对 \(2^i - 1\) 操作,次数为 \(\log n\)。
总次数小于 \(4\log n \le 120\),足够通过。
快国庆了,九月也就结束了。

浙公网安备 33010602011771号