各种比赛记录

2026/8/10 arc226

前半小时过两个题,后面 T3 没做出来。

  1. 为什么不写爆搜??

    爆搜的作用:十分钟内,确定性地得到一组解。

  2. 先多编一会,编明白再写,尽量一遍写对

  3. 适当证明正确性。


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)\)

posted @ 2026-08-17 08:42  _Bonely_Muffin  阅读(15)  评论(0)    收藏  举报