各种比赛记录
2026/8/10 arc226
前半小时过两个题,后面 T3 没做出来。
-
为什么不写爆搜??
爆搜的作用:十分钟内,确定性地得到一组解。
-
先多编一会,编明白再写,尽量一遍写对。
-
适当证明正确性。
2026/8/17 arc227
大了,感觉打的问题很大。
A 有点太激进了,没有观察任何性质就开始猜结论,好像没有道理。
应该先想到贡献怎么计算,\(\sum_{i=1}^n |p_i - q_i|\),然后就可以直接想到取中位数了。
B 我以为只能链表维护。实际上有一个做法,注意到插入的点是单调的,因此可以用一个栈维护所有未加入的数。
C 尝试不断用 \(\leq n\) 步将两个点合并起来,以及尝试了一些能做这一点的结构。发现后面的情况很复杂,编倒闭了,然后好像就啥也想不到了。
其实应该多想想 \(n^2\) 可能是什么(比如 \(S\) repeat n times,或者 \(S\) 的所有循环移位,什么的)。先思考一些小结构有什么用。
可以敏锐一点,思考一下什么样的东西不好做,尝试先思考这个串的做法。
总之就是,可以想一些特殊的 case。
相邻合并,可以使用连续段刻画,扭头就忘。
正难则反。
2026/8/27 NOI 模拟赛
整场会 \(0\) 个题,一整场打的都很难受,但是最后蠕动了一些分,还算能看。
感觉这场对我来说,比较有训练效果,就当是锻炼心态吧。题目挺难的。
T1 是 ad-hoc。
容易陷入的误区:尝试硬找到一个集合,\(\sum_{x \in S} V_x = \frac{S_v}{2}\) 且 \(\sum_{x \in S} m_x = \frac{S_m}{2}\)。
实际上来说,使用对 \((V,m)\) 建系的方法,或者分析两个背包,这一类的刻画都比较 weak。一个问题是,这些东西都没办法很好地描述“切割”,因为对 \(V,m\) 同时做切割,这是难以刻画的。
尝试想一些高妙的刻画。
考虑先选出来 \(\frac{S_v}{2}\)。然后考虑一个更有道理的刻画,假设每个物品都有一个密度 \(\rho_x = \frac{m_x}{V_x}\),要求选出来的物品 \(\sum {V_x \rho_x} = \frac{S_m}{2}\)。
可以考虑把物品看成 \(V_x \times \rho_x\) 的矩形,然后选择一个底边总长度为 \(\frac{S_v}{2}\)、面积总和为 \(\frac{S_m}{2}\) 的集合。最多可以纵向切开两个矩形。
先假设我们在环上选择一个长度 \(\frac{S_v}{2}\) 的区间。发现这个东西非常连续:区间向右移动 \(eps\),面积的变化是连续的。
发现由于连续,一定可以找到面积为 \(\frac{S_v}{2}\) 的区间,而区间至多只需要切两刀。做完了。
(另:转矩形可能是有道理的。因为对 \((V,m)\) 同时的切割不好刻画,考虑对每个位置赋一个值,为它的密度,在图形中则体现为这个位置的“高度”。这样就可以较好地描述出切割了。)
不会做怎么办:
(假如我手速快)不断 shuffle 数组,并随机两个数,解方程,看看能否切割满足条件。需要尝试编一些策略来划分 \(S,T\)。
T2:计数题别拆贡献。
拆贡献会得到一个 \(\text{LCT}\) 维护 \(\text{DDP}\) 的做法,轻子树需要使用平衡树来维护,很难写。
直接做 DP,发现是 [NOI2020] 命运,直接做完了。
2026.8.31 arc++228
感觉打的倒没啥问题。
做 \(A\),发现十几分钟完全不会 poly,而且榜上没人过,感觉不好做,所以开 \(B\)。
过了一会发现确实先有人过 \(B\)。好像做了一会,意识到按照值域做,然后刻画出来了充要条件,然后发现了包含的性质,又想了一会发现贪心就对了。写完过了。
回去做 \(A\)。过了很久,发现容斥可以转 \(01\),然后就可以 poly 了。想了想是 \(O(n^4)\) 的。这个状态数都是四次方的。后面想了很久,想了一下快速转移 \(M\) 步,以及状态数是否真的是四次方,但是都没啥招。
好像中间也看了一下 \(C\) 是什么,但是不太会,场上也没啥人过,因此就没仔细做。
最后实在没招了。开始写 \(A\) 四次方,准备硬卡常看看能不能冲过去。很遗憾最后没有卡过去。
\(A\):
第一步容斥不够优越。考虑,如果对于每个 \(i\),钦定是初始 \(P,Q\) 中的哪一个 \(i\) 最终到达 \(P\),就保证了两边 \(1\) 的个数和一定为 \(n\)。
这样状态数就是三次方,总复杂度也是 \(O(n^3)\) 了。
\(C\):
需要计算 \(\sum_{i=0}^x \sum_{j=0}^y \binom{x}{i} \binom{y}{j} \min(i,j)\) 状物,多测,\(x,y,q \leq 2\times 10^5\)。
看着不能简单计算,所以尝试莫队的 \(O(n \sqrt n)\)。猜测可以转化成组合数前缀和。
枚举 \(\min(i,j)\) 是哪个,可以转化成 \(\sum_{i=0}^x \sum_{j=0}^y \binom xi \binom yj [i \leq j]\)。考虑其组合意义,有 \(x\) 个红球,\(y\) 个蓝球,球互不相同,要求选红球的个数不超过选蓝球的个数。
进行如下双射:翻转蓝球是否被选择。这样就将限制转化成了,选择的总球数不超过 \(y\)。因此就变成了组合数前缀和。
使用莫队即可做到 \(O(n \sqrt n)\)。
2026.9.4 CSP-S 模拟赛
T1 exp,虽然不知道何意味,但是秒了。
T2 这个次短路,感觉挺深刻的。
T3 方差诈骗啊,那咋办,呜呜呜。后面是一些,扫描一下基准线,然后维护最近的集合。可以写一个 \(O(n^2)\),或者一个略微难写的正解。
T4 给了 45 部分分,挂成 5 分了,那咋办。是不是应该对拍的。然后正解似乎是分治一下就可以做了。
OI 赛制还是太难打了,日啊。
2026.9.5 CSP-S 模拟赛
OI 赛制太难了呃呃。但是也出现了一大堆别的问题。
C 题太急了。应该先编明白再开写。假了之后,这场直接倒闭了。
考虑这个东西,有一个很显然的想法,是将所有答案不为 \(S\) 的叶子全都改为 \(S\),但由于非叶子不能修改,这可能做不到。
实际上是一定可以做到的。因为假设所有非叶子节点的并为 \(T = \bigcup_{u \notin L} A_u\),则 \(S\) 必须满足 \(S \supset T\),所以一定可以修改。做完了。
2026.9.8 CSP-S 模拟赛
打的除了区就没啥问题。甚至写了个 2log 卡过去了。
A 套路地维护,发现在 trie 上修改 cnt 时,答案数组的变化量是 \(O(1)\) 的,因此直接做就是 \(O(n)\)。
B 直接做相当于一个三维偏序,只能 cdq 做到 2log。题目里面求的这个东西看上去就很奇怪,肯定要在这上面做文章。
注意到,若 \(s_i - s_j > 0\) 且 \(t_i - t_j > 0\),那么将 \(j\) 继续向前扩展一定更优。因此最优转移一定满足 \(s_i - s_j = 0\) 或 \(t_i - t_j = 0\)。
这样就变成了二维偏序,1log 即可解决。
C 有一个很直接的 poly 做法,就是 \(dp\) 到第 \(i\) 个位置,该位置为村民,并记录前后各有多少只狼。看似是三个状态,实际是 \(n^2\) 的,因为村民可以确定其中一边的信息。
因此考虑到,更简单的写法是,\(dp_{i,x}\) 表示第 \(i\) 个位置,是否可能全局有 \(x\) 只狼。这样的好处是每个 \(x\) 都是互相独立的。我们的做法相当于枚举 \(x\) 并进行判定。
一个做法:刻画转移形态,注意到有一些转移一定存在,有一些转移只对于某个值 \(x\) 存在。因此可以直接扫描 \(x\),使用线段树维护动态 \(dp\)。
复杂度 \(O(n \log n)\),不太好过。
有一个神秘特性,\(dp_i\) 对应的 \(S=\{x_1,x_2,\cdots,x_k\}\),要么是全集,要么只有 \(\leq 2\) 个元素。直接维护集合即可通过。
D 不知为什么做的这么区。证明了我是个傻逼。
首先一定会在最后 \(k\) 步操作。如果选了前面的,显然向后调整不劣。
然后考虑,从 \(a_1\) 到 \(a_m\) 中出现过的数,都不那么重要,因为加入 \(\rm{mex}\) 时不太会加入这些数。最后答案也只可能是 \(a_1\) 到 \(a_m\) 中没有出现过的数。
显然对同一段前缀,\(k\) 越大答案越大。
然后发现,这个 \(f_{m,k}\) 一定程度上可以继承前面的信息。比如 \(f_{m,k}\),就是在 \(f_{m-1,k-1}\) 的基础上再做一轮操作。
考虑从前往后扫描,维护 \(q_j\),表示从 \(j\) 到 \(i\) 都进行操作二的 \({\rm mex}\) 值。
注意这里 \({\rm mex}\) 的值当然不太好维护,但是,\({\rm mex}\) 在所有未出现的数中的排名是容易维护的。
类似于,加入一个新数 \(a_i\) 时,若 \({\rm mex}< a_i\) 则排名会下降 \(1\),否则,\(\rm{mex}\) 排名不变。而加入 \({\rm mex}(T)\),显然是全局排名 \(+1\)。
由于 \(\rm{mex}\) 数组关于 \(k\) 具有单调性,可以直接二分找到区间,然后修改即可。
2026.9.12 CSP-S 模拟赛
我已启动
好极限。
以后遇到不好写的做法,先不要急着 all in,再往下想一想。万一灵机一动,就获得了好写的做法呢?
ABC 比较容易。
D 的做法:题目等价于,将每个点变成向四个方向分别延伸 \(L,R,U,D\) 的矩形,求 \(\min (L+R+U+D)\),满足这些矩形的并集能覆盖整个矩形。
显然直接枚举 \(U,D,L,R\),就是 \(O(V^4 {\rm poly}(n))\)。去掉 \(V\) 的方法,则显然是观察到将有用的值离散化后,为 \({\rm poly}(n)\) 级别。
\(O(n^3)\) 显然是想让你枚举一些东西,然后快速计算该情况下的答案的。
注意到枚举 \(L,R\),就可以快速算出 \(\min (U+D)\)。相当于平面上有一些线段,只可以往上下扩展。那么最小的 \(U+D\),形如 \(\min(\max\{u+d\},\max\{a\})\)。
其中,\(u,d\) 是向上或向下扩展的最小长度,而 \(a\) 是某两线段间距的长度。
有用的 \((L,R)\) 看上去显然是 \({\rm poly}(n)\) 级别的。但是具体是多少还要进一步分析。
考虑,刻画 \(u,d,a\) 在一对 \(L,R\) 下的值如何计算。
对于 \(u\),点 \(i\) 可能会对其产生 r - a[i].y 的贡献,贡献的条件可能是 \(L\) 不超过一个值 / \(R\) 不超过一个值 / \(L+R\) 不超过一个值。(对于 \(d\) 同理)。
对于 \(a\),某一对点 \((i,j)\) 可能会对其产生 a[i].y - a[j].y - 1 的贡献,贡献的条件可能是 \(L+R\) 超过一个值 \(K\),并且 \(L\) 不超过一个值 / \(R\) 不超过一个值 / \(L+R\) 不超过一个值。
上面关于 \(L,R\) 的限制不会超过 \(O(n)\) 种,关于 \(L+R\) 的限制则不会超过 \(O(n^2)\) 种。
因此,我们可以直接计算出所有限制,并枚举这些限制的分界点,就会得到一个 \(O(n^3 \times {\rm poly}(n))\) 做法。可能直接写,可以获得 \(80\) 分,但是代码难度也很高。
优化的方法也比较简单,枚举过程中用堆快速维护 \(u,r,a\) 即可做到 \(O(n^3 \log n)\),实测非常快。
这个做法极其难写。首先处理限制使贡献不重不漏就很恶心,然后还要对 \(10\) 种贡献开 vector,并用双指针优化复杂度。
考虑我们可以从这个做法导出什么。
可以发现,假如我们枚举 \(L+R\),那么枚举 \(L\) 的过程,可以看做将每个点扩展为长度 \(L+R\) 的线段,然后去用 \(r \times c\) 的矩形去截取这些线段,并计算贡献。
有用的 \(L+R\) 基本上只包括 a[i].x - a[j].x 以及 (a[i].x - 1) + (r - a[j].x),共 \(O(n^2)\) 个。并不需要像上面一样,不重不漏地算出来具体的贡献。
枚举 \(L+R\),然后模拟扫描矩形的过程。
考虑将线段端点全部离散化下来。然后处理出来,所有端点处的 \(u,d,a\) 分别是多少。接下来相当于扫描一个长度为 \(r\) 的窗口,然后取出区间内部的 \(u,d,a\) 的最小最大值,计算答案。
这样复杂度就可以做到 \(O(n^3 \log n)\) 或者 \(O(n^3)\) 了,很好写。
2026.9.17 CSP-S 模拟赛
可以尝试,一直把自己会的东西、要做的东西,都写在纸上。
不要急着写,先编明白。
B 需要先猜测出来,会存在歧义的只有最小正周期 \(p\) 的倍数。
然后进行计数即可。
C 题,可以先上笛卡尔树。每一步要么是跳祖先,要么是跳子孙。
根据某个题的 trick,在 \(i \rarr j\) 路径上,必定经过 \(\max(a_{[i,j]})\),所以可以把路径拆开成两段。
考虑,跳祖先这个很好处理,只有 \(O(\log n)\) 个点是关键的,但是跳进子树就让计算变得很麻烦,状态数会变多。
思考 \(i \rarr x\) 的路径,实际上形如:从 \(i\) 开始,经过一些祖先,或跳进右子树再跳出来,形成一条路径。
发现,在跳进子树的情况中,从所有节点跳出子树,都是等价的。
进一步思考,我们需要计算的是:从子树的任意一个点出发 \(s\),经过一条路径,走到子树内任意的一个节点 \(t\),并跳出去。
因此,这个问题只和子树有关,信息量很少。然后发现,记录 \(f_u\) 为 \(u\) 子树内路径条数,则 \(f_u\) 是可合并的。
这样就可以直接使用平衡树维护笛卡尔树了。做完了。
复杂度 \(O((n+q) \log n)\)。实现上可以使用 fhq treap。
D 题,直接对不合法的点容斥,可以获得一个 \(O(n^2k)\) 做法。似乎并不好优化。
官解是,对于链划分进行容斥,计算出来容斥系数,然后即可获得 \(O(n^2k)\) 做法。
容斥系数只有在 \(l \equiv 0 \pmod {k+1}\) 以及 \(l \equiv 1 \pmod {k+1}\) 时不为 \(0\),这样可以分析出来,有用的当前链长 \(\bmod {k+1}\) 只有 \(\min(k+1,\frac{siz}{k+1})\) 种,因此复杂度为 \(O(n^2 \sqrt n)\)。

浙公网安备 33010602011771号