2026.9 做题记录

1 NFLS CSP 模拟赛 9 T1

显然求出极小 \(\operatorname{MEX}\) 区间即可。一个区间 \([l,r]\) 是极小 \(\operatorname{MEX}\) 区间当且仅当不存在 \([l',r'] \subsetneq [l,r]\) 使得 \([l',r']\) 区间 \(\operatorname{MEX}\)\([l,r]\) 区间 \(\operatorname{MEX}\) 相等。我们可以说明只有 \(O(n)\) 个这样的区间,求法是按 \(r\) 扫描线,每次加入一个数 \(c\),考虑所有 \([l,r-1]\)\(\operatorname{MEX}\) 等于 \(c\) 的,会变大,每个颜色段只有最靠后的 \(l\) 有用,而总共只会增加 \(O(n)\) 次连续段,所以只有 \(O(n)\) 个极小 \(\operatorname{MEX}\) 区间。复杂度 \(O(n \log n+q)\)

2 NFLS CSP 模拟赛 9 T2

考虑 \(i<j\) 配对的答案是什么。最优策略必然是从 \(i\) 开始向左走一段然后回头到 \(i\),然后向右走到 \(j\),然后 \(j\) 向右一段再走回来 \(j\)

求出 \(l_i,r_j\) 分别表示 \(i\) 向左回来,\(j\) 向右回来的最大值,中间的答案形如 \(f(s_j-s_i)-(a_j-a_i)\)。可以看出所有贡献都可以看作 \(i,j\) 独立的和而没有交叉项,所以问题变为一个长度为 \(n\) 的序列,每个位置是左括号获得 \(L_i\),右括号获得 \(R_i\),而且要求括号匹配。先钦定全是左括号然后从前往后反悔贪心即可。

3 NFLS CSP 模拟赛 9 T3

做法很多。

一个做法是观察到,以任意点为根,一个集合内必然满足其某个直径的某个端点在深度最大的点上,所以每个集合钦定代表元为深度最大的点进行计数,从小往大扫,点分树维护这个过程即可。复杂度 \(O(n \log^2 n)\)

另一个做法是,考虑符合条件当且仅当存在至少一个点 \(s\) 满足 \(s\) 到每个点距离不超过 \(\dfrac{k}{2}\)\(k\) 是奇数时可以每条边上加一个点之类的。而若 \(s\) 存在则符合条件的 \(s\) 是一个连通块,点边容斥,这样只需要对每个点和边算答案,点分治可以做到 \(O(n \log n)\)

由于这题只用选三个点,还可以进行长剖,这也是我赛时实现的算法。考虑每个点维护 \(f_{u,0/1,x}\) 表示子树内选 \(1\)\(2\) 个点,选的点到根的路径长度为 \(x\) 的答案,选两个点时要求这两个点路径长度不超过 \(k\)。由于 \(x\) 是深度相关信息可以长链剖分维护,维护线段树即可支持上述所有操作。复杂度 \(O(n \log n)\)

4 CF2257F2

很显然 DDP 可以做到 \(O(nx^3+qx^3\log n)\)。具体来说直接 DP 就是每个位置维护 \(f_{i,c}\) 表示考虑到第 \(i\) 个平台,现在的位置距离 \(i\) 的结尾还有 \(c\) 时的答案。只需要考虑 \(c < x\),然后线段树维护矩阵。

可能空间过不去,官解是底层分块,但其实仔细观察发现空间卡的不是太紧,不对叶子维护矩阵,每次查叶子重新算就可以过。

5 CF1863I

我们认为如果一条路径删去一个端点加上一个点得到了另一条路径,则称这两条路径等价。

注意到等价路径都是同时选或不选,所以缩在一起,然后可以发现限制变成了树上选一个点不能选其祖先。这样直接 DP 即可,复杂度 \(O(n^2)\)

6 CF1866F

我们可以轻松做到 \(O(n\sqrt n)\)。注意到修改只有 \(\pm 1\) 的增量,其对排名的影响只有某种颜色的排名同时加减 \(1\)

考虑离线,令 \(B=O(\sqrt n)\),对序列 \(a,b\) 内的每种颜色考虑其历史出现次数最大值,若其大于 \(B\) 称之为大块否则称之为小块。

先考虑如何处理查询。对于满足条件的 \(j\),按照 \(a_j,b_j\) 在两侧是大块还是小块分别处理。

  1. \(a_j,b_j\) 同时是小块。直接对所有满足条件的 \(j\),将 \(a_j,b_j\) 排名之和加入一个数据结构内,支持 \(O(1)\) 单点修改,\(O(\sqrt n)\) 查询。分块平衡即可。修改时由于影响的是小块,只有 \(O(\sqrt n)\) 个修改,直接维护即可。
  2. \(a_j,b_j\) 中一个大块一个小块。以 \(a_j\) 大块 \(b_j\) 小块为例,另一方面对称。查询时,我们枚举大块,并对每个大块将对应的 \(b_j\) 的排名加入一个数据结构,需要 \(O(1)\) 查询。现在考虑修改,发现如果修改的是 \(b\) 小块需要修改 \(O(\sqrt n)\) 个位置的信息,看似需要做到 \(O(1)\) 修改。但是注意到排名的变化量也是 \(\pm 1\),所以其实是 \(a_x \gets a_x-1\)\(a_{x-1} \gets a_{x-1} + 1\) 或者相反的,而直接套用 \(O(1)\) 查询的分块,这个分块结构可以直接 \(O(1)\) 做这个修改。这一部分复杂度也是 \(O(n \sqrt n)\)
  3. \(a_j,b_j\) 同时为大块。维护 \(c_{i,j}\) 表示处于 \(a\) 的第 \(i\) 大块和 \(b\) 的第 \(j\) 大块的点的个数,以及 \(s_{i,j}\) 表示其对应的前缀和。查询时枚举 \(a\) 中大块,对 \(b\) 中的大块双指针即可。

总复杂度 \(O(n \sqrt n)\),若强制在线可能可以动态维护大小块。

7 CF1864G

操作看起来很诡异,特别是限制三。考虑每个数最终移动到的位置,可以发现若行列都不相同,那么其移动两次后,\(x,y\) 的差值都是由 \(a,b\) 唯一确定的。而若 \(x\)\(y\) 相同,必然不会移动两次。所以限制三一开始就可以判掉。

现在考虑第一次操作的行或列,以行为例,列对称。对于第一次操作的行,我们声称操作后,这行上所有数都移动到了其所需的列上。原因是如果没移动到对应的列,其必须再移至少两次或者在这行再操作一次,而这是和题目限制不相符的。

进一步,我们声称只要第一次操作的行确定,我们必定可以确定每行每列的循环位移的参数。首先每列的参数可以确定,这是因为这行操作后,这行的所有数都只能进行一次操作了,并且这些数都移动到了对应的列,所以列上循环位移的参数确定。进一步,每一行的参数也确定。其原因是考虑任意不在一开始操作的行上的一个数,其为了移动到目标位置,只有至多两种方案。目标与其同行或同列是平凡的,否则其和目标不同行不同列,看起来有两种移动方案,但是注意到如果两种方案都可以,那么意味着有两列循环移动的参数相同。而这是不可能的,因为一开始要求每个移动两次的位置的到目标位置的 Delta 不同。

这样我们确定了每行每列移动的次数。但原问题的计数还需要考虑操作顺序。而进一步我们可以说明,对于任意行和任意一列,只要他们需要同时进行操作,则它们之间的顺序是唯一确定的。换句话说,我们其实需要计算一张完全二部图的拓扑序个数。首先如何确定操作顺序。考虑任意一行 \(i\) 和一列 \(j\),考虑 \(a_{i,j}\) 的移动顺序就可以确定相对顺序了。现在考虑怎么计算完全二部图拓扑序个数。只需要对行排序,两行的顺序关系是若存在一列对这两行的顺序不同则可以确定顺序,否则这两行没有顺序区分。每个没有区分的长度为 \(i\) 的连续段将答案乘以 \(i!\),将列插进来也是类似的找到需要插入的空隙,每个空隙若有 \(c\) 个加入的列则乘以 \(c!\) 即可。

复杂度 \(O(n^3)\)

8 CF1861F

枚举 \(i\),枚举一种颜色表示这个人的个数最多的牌,贪心地肯定先尽量多的放这种牌。然后二分答案,判定容易看作网络流形式,而有一侧只有 \(4\) 个点所以直接转最小割,枚举子集计算答案即可。

9 CF1859F

肯定是走到了升级点后升级若干次然后就再也不升级了。分类讨论升级点在 LCA 的哪一侧,然后所有信息都可以倍增维护。

10 CF1852E

好题。

我们考虑对给定序列计算每个区间 \(c_{i,j}\) 的权值的方式,按照权值从大到小排序,对每种权值 \(x\) 找到最前出现位置 \(i\),最后出现位置 \(j\),相当于对所有 \(l \in [1,i]\)\(r \in [j,n]\),且 \(c_{i,j}\) 未确定,然后将 \(c_{i,j}\) 覆盖为 \(x\)。实际上是对每个 \(i\) 维护 \(r_i\) 表示 \(l=i\) 时,最小的未被确定的是 \([i,r_i]\) 的结果。相当于是前缀 chkmin。

现在先对 \(a\) 从大到小做上述操作,称一种颜色是好的当且仅当遍历到这种颜色时,至少修改了一个 \(c_{i,j}\)。可以发现对于这样的颜色 \(x\),其必然满足 \(b_i=b_j=x\)\(i,j\)\(x\)\(a\) 中出现的最靠前最靠后的位置。

现在序列 \(b\) 确定了若干位置,还有若干位置没有确定,考虑这些位置怎么确定满足条件,以及怎么确定才能使得和最大。

我们还是从大到小遍历 \(a\) 的颜色 \(x\),可以发现 \(x\) 是否为好的颜色有本质区别,若 \(x\) 是好的则下一次只能取 \(x-1\),而若 \(x\) 不是好的,那么其在 \(b\) 中目前没出现过,其也可以作为一个备选答案。如果 \(x\) 是好的,我们将 \(b_{i}\)\(b_{j}\) 中还没确定的数暂且都填为 \(x\)\(i,j\)\(x\)\(a\) 出现位置最靠前的和最靠后的,因为这样填不会影响合法性,也不会影响目前任何位置的 \(r_i\)。现在尝试填入 \(x-1\),或者 \(x\) 不是好的时,填入 \(x\)。考虑填入的位置,显然我们只关心填入的最前位置和最后位置,要满足这种颜色不会成为好的。所以最前位置越前越好,最后的位置越后越好。考虑目前 \(b_i\) 未确定的集合 \(S\),最小值最大值 \(c,d\),那么必然有 \(l \leq c\)\(r \geq d\),也就是说这次填后就直接将整个 \(b\) 全部确定出了。但是直接选 \([c,d]\) 并不一定是合法的,此时我们可以替换某个曾经被暂且确定的数换为这个数,从而扩大 \([l,r]\)。我们可以说明最优解有 \(l=c\)\(r=d\),以 \(l=c\) 为例,在曾经维护的 \(r_i\) 上二分可以找到最小的满足条件的 \(r\)。然后在 \([r,n]\) 中找到最优的 \(r\),也就是被暂且确定的值最小的位置即可。而有 \(l=c\)\(r=d\) 的结论是因为所有好颜色对应区间 \([i,j]\) 必然有 \(c \notin [i,j]\)\(d \notin [i,j]\)。如果取了某个 \(l<c\),那么其必定被以前某个 \([i,j]\) 区间覆盖,且 \(j<d\),从而 \(r=d\) 必然符合条件,不需要更大的 \(r\)

使用线段树维护需要的信息即可。复杂度 \(O(n \log n)\)

11 CF1824D

4-side 矩形和差分改为 2-side 矩形和查询。

现在只需解决 \(\sum \limits_{i=1}^x \sum \limits_{j=1}^y g(i,j)\)

可以发现 \(g(i,j)\)\(g(i-1,j)\) 之间的转移结构很好看。按照 \(i\) 从大到小扫描线,对每个位置 \(j\) 维护 \(g(i,j)\),那么 \(i\) 变为 \(i-1\) 相当于找到 \(a_{i-1}\)\([i,n]\) 第一次出现,然后做一个区间覆盖。

要维护 \(i\)\(1\)\(x\) 的和只需要维护历史和。那么就是线段树支持区间覆盖区间历史版本和。复杂度 \(O((n+q)\log n)\)

12 CF1826F

不知道这个题想考察什么,感觉有点诡异。

我们先忽略精度误差,也忽略点的坐标差至少为 \(1\) 的限制。

每次得到的是和查询直线垂直的若干条直线。一个点如果在所有询问中都出现过,则其就是一个可能的备选点。

询问一次得到的是 \(n\) 条直线,其上有无穷个点,无法确定答案。

若询问两次,会得到 \(n\) 条直线和 \(n\) 条直线的 \(O(n^2)\) 个交点,依然无法确定答案。

但三次必然可以,先询问 \(x=0\)\(y=0\) 确定所有点 \(x\) 坐标集合以及 \(y\) 坐标集合,得到 \(O(n^2)\) 个备选点。而随机一条直线问,其和这 \(O(n^2)\) 个点几乎必然只有恰好 \(n\) 个交点即为答案。这样就是三次询问了。

有误差时,实现起来比较麻烦。每次随机斜率时,设一个 \(\varepsilon\),如果这条斜率和 \(O(n^2)\) 个点中任选两个点相连的直线的斜率差都大于 \(\varepsilon\),则认为这个斜率是好的,注意实现细节即可通过。

13 CF1804H

压根不是题,难点在于注意到 \(O(4^k)\) 可以通过。

如果是链上距离,很容易状压 DP。

\(x<y\) 环上距离是 \(\min(y-x,n-y+x)\),DP 时不好做。

我们钦定一个半圆,比如 \([0,\dfrac{k}{2}]\) 上填的是集合 \(S\)。然后对另一个半圆 DP,记录目前到的位置,以及这个位置之前 \(\dfrac{k}{2}\) 个数构成的集合。不难发现这样可以进行转移。

分析复杂度可知状态数 \(\sum \limits_{i=0}^{\frac{k}{2}} \dbinom{\frac{k}{2}}{i}\dbinom{\frac{k}{2}}{\frac{k}{2}-i}=O\left(\dbinom{k}{\frac{k}{2}}\right)\)。转移如果枚举删哪个位置加哪个位置就要 \(O(k^2)\),但是分步转移先删后加就是 \(O(k)\)

所以复杂度 \(O\left(\dbinom{k}{\frac{k}{2}}^2k\right)=O(4^k)\),看起来不太能过但确实过了。

14 CF1781G

鬼题。

我们猜测答案是 \(n \bmod 2\),但是样例都过不去。这时不知道为什么有人能注意到样例是唯一的反例。

我们尝试归纳说明并给出构造。\(n\leq 8\) 时,通过爆搜,不难说明必有解。

对于一般的 \(n\),只要我们能将二叉树划分为若干大小为 \(2\)\(3\) 的连通块,则自然能构造出 \(n \bmod 2\),原因是 \(2\mid n\) 时大小为 \(3\) 的连通块有偶数个可以直接构造,\(2 \nmid n\) 时有奇数个自然能取到下界。

我们接下来说明,对于 \(n>8\),总存在将树划分成若干大小为 \(2\)\(3\) 的连通块的方法。

若存在点 \(u\),满足其两个儿子都是叶子,则划分出了一个大小为 \(3\) 的连通块。另一方面,若存在点 \(u\) 满足其只有一个儿子且其为叶子,则划分出了一个大小为 \(2\) 的连通块。这都可以归纳进子问题。我们声称上述情况之一必然成立。据此,我们也进行归纳。\(2 \leq n \leq 3\) 时显然。\(n>3\) 时,任取一个叶子,考虑其父亲,则当且仅当父亲有另一个儿子且儿子子树至少为 \(2\) 时这个点不能选为构造。而根据归纳假设这个儿子子树至少为 \(2\) 所以必然有解。据此不难构造。

15 CF1767F

直接拍到 DFS 序上做四维莫队是 \(O(n^{\frac{7}{4}})\) 的。

考虑 dsu on tree 过程,可以对一个支持插入删除的数据结构进行 \(O(n \log n)\) 次操作,得到每个点的子树信息。

所以对长度 \(O(n \log n)\) 的序列做二维莫队即可。复杂度 \(O(n\sqrt q \log n)\)

16 CF2034H

集合 \(S\) 符合条件当且仅当 \(\forall i \in S: \gcd \limits_{j \neq i,j \in S} j \nmid i\)

在质因数角度考虑,这意味着对于任意 \(i \in S\),存在某个质因子 \(p\),满足 \(i\) 是集合 \(S\)\(v_p(i)\) 的唯一最小值。对于每个 \(i\),这样的 \(p\) 互不相同。

考虑搜索一组 \((p_i,\alpha_i)\),表示钦定质因子 \(p_i\) 的最小幂次为 \(\alpha_i-1\)。设 \(M=\prod p_i\)。那么对于每个 \(i\),要求 \(a\) 中存在一个数 \(x_i\) 满足 \(\dfrac{M}{p_i^{\alpha_i}} \mid x_i\)\(M \nmid x_i\)。则 \(S=\bigcup \limits_{i}\{x_i\}\)。记 \(c_i\) 表示 \(a\)\(i\) 的倍数的个数,那么限制就是 \(c_M \neq c_{\frac{M}{p_i^{\alpha_i}}}\)

这意味着对 \(\max \dfrac{M}{p_i^{\alpha_i}}\) 有大小限制。可以发现这样的 \((p,\alpha)\) 序列个数直接搜索是可以通过的,问题解决,需要一些剪枝。

17 NFLS CSP 模拟赛 10 T2

爆搜。

18 NFLS CSP 模拟赛 10 T3

考虑容斥。我们钦定集合 \(S\) 内点的度数不超过 \(1\),那么其中会有若干个孤立点,若干组匹配,已经一个集合 \(T \subseteq S\) 满足其唯一邻居在 \(S \setminus T\) 内。

这是可以分步容斥的,容易做到 \(O(3^n)\),可以通过。

19 CF1483E

首先容易做到 \(O(\log n)\)。具体来说,先倍增依次询问 \(1,2,4,\cdots\),然后容易求出 \(m \in [l,r]\),其中 \(2l \geq r\)。然后直接二分,每次先将硬币数至多加两次 \(l\) 直到可以表示出 \(mid\),粗略计算可以知道次数大概是 \(4 \log n\) 左右。

我们先感性思考一下,显然当金币数比较多的时候,我们更愿意选取偏向 \(mid\) 的位置,而金币比较少时,我们更愿意询问靠左一点。

对于目前金币 \(s\),区间限制 \(m \in [l,r]\),定义估价函数 \(f(s,l,r)=\log_2 (r-l+1)-\log_2 \dfrac{s+1}{l}\),前者是 \([l,r]\) 的信息量,后者是为了跟前者量级相当而拟合出来的参数。我们钦定 \(f(s,l,r)\) 较小的信息会更优。

现在进行决策时,选择使得 \(\max(f(s-x,l,x-1),f(s+x,x,r))\) 尽量小的 \(x\) 进行操作,这个 \(x\) 可以在范围内三分求出,可以通过,询问不超过 \(100\) 次。

20 CF1517G

定义 \((0,0)\) 表示点的 \(x,y\) 坐标都是偶数,其他类似。

注意到,每种图案都存在一条路径,\((1,1) \rightarrow (0,1) \rightarrow (0,0) \rightarrow (1,0)\),并且每一条这样的路径都是一种图案。

那么建立一个四分图,做最小割即可。

posted @ 2026-09-01 14:47  HappyBobb  阅读(68)  评论(0)    收藏  举报