11 月 NOIP 模拟赛总结

运用 mxz 的难度归类每一道题:

【\(\color{lightgreen}{0}\)】:水题,没有经历什么思考/代码过程就做出,赛时几乎可以切掉这种类型,属于是必须拿分的类型,但是介于赛时会降智,这种题在正赛时需要谨慎,防止大意、进死胡同。

【\(\color{green}{1}\)】:与能力水平较匹配题,花费了中等时间思考、写代码,在正常情况下是可以做出的,正赛时可能需要更长时间思考,千万注意细节、思维的连续性和完整性。

【\(\color{darkgreen}{2}\)】:略高于能力水平的题,可能花费长时间思考、写代码才可能做出。

【\(\color{brown}{3}\)】:高于能力水平的题,经过努力+理解可以看懂题解并理解此题的完整思路,同时可以写出完整题解。

【\(\color{purple}{4}\)】:不会且看不懂题解,先放放。

NOICA #19

T1 magic(Ad-hoc)\(\star\)

难度 \(\color{lightgreen}{0}\),赛时通过人数 \(27\),未做出,得分为 \(0\)。

怎么会是呢?注意比较特殊的限制 \(n,m\) 均为偶数。考虑把原来的路径转化成回路,由于 \(n,m\) 都是偶数这一定可以做到,随便构造一坨就行了,然后就很简单了,给环任意定向,找一个前缀和最小的点作为起点按环的方向转即可。

思维漏洞:没有想到 \(n,m\) 为偶数的特殊性。路径 -> 环的转化。

T3 zuo(Ad-hoc,线性代数)

难度 \(\color{brown}{3}\),赛时通过人数 \(3\),未做出,得分为 \(10\)。

发现用长度为 \(2x\) 的环能够求出 \(\left(\sum\limits_{i=0}^{N-1} [i\bmod x=y]S_i\right)\bmod 2\) 的值。

然后把所有 \((x,y)\) 对都搜出来,发现 \(x\le 51\) 时构成的线性无关方程组只有 \(806\) 个。再凑一些,我们发现拉一条链再接自环可以用 \(i+2\) 个数可以问出前 \(i\) 个数的信息,这样能够先把前 \(100\) 个问出来,但是仍然要用 \(x=54\)。再考虑后缀,用 KMP 自动机作为询问的 DFA 即可,能把最后 \(100\) 个问出来。这样就压到了 \(x\le 51\) 即可解决,正好 \(M=102\)。

NOICA #20

T3 overcoat(平衡树)

难度 \(\color{darkgreen}{2+}\),赛时通过人数 \(2\),未做出,得分为 \(45\)。

首先可以简单转化成:定义 \(b_i=a_{2i}-a_{2i-1}\),给出递推 \(c_i=\left\lceil\dfrac{b_i-c_{i-1}}{2}\right\rceil\),最后答案就是 \(\sum c_i\)。有一个比较 naive 的想法是单点修改 \(b\) 后至多只会影响接下来的 \(O(\log V)\) 个位置,但这是错的,正确的分析是:令 \(f_t(x)\) 表示以 \(x\) 为初值迭代 \(t\) 次后的结果,有性质:\(|f_t(x)-f_t(y)|\le \left\lceil\dfrac{x-y}{2}\right\rceil\),那么在 \(O(\log V)\) 轮之后 \(|f_t(x)-f_t(y)|\le 1\),此时虽然差最多只有 \(2\) 但是可能 \(+1,-1\) 不停震荡,因此暴力修改是错误的。

高香蕉给出的启发式做法。由上述分析我们发现虽然改变次数可以很多,但是本质不同的 \(c_i\) 数量其实可以接受,考虑将 \(c_i\) 相同的事件放在一起统一处理。按位置从前往后扫描,我们尝试维护所有时刻 \(t\) 时的序列对应的 \(c_i\),开 \(m\) 棵平衡树表示 \(c_i\) 的等价类,每棵平衡树内的事件具有相同的 \(c_i\),平衡树内按时刻 \(t\) 为关键字排序。在扫到位置 \(i\) 时,位置 \(i\) 的修改事件划分出若干时刻区间 \([t_k,t_{k+1})\),这些时刻内的事件有 \(b_i=v\)。因此遍历每个等价类,在平衡树上将这些子区间内的事件分裂出来,计算新的 \(c_i\leftarrow \lceil(v-c_i)/2\rceil\)。处理完后将 \(c_i\) 相同的再次合并起来重构等价类,需要用到平衡树的可交并。

ds 给出的正确性证明,令 \(T_i\) 表示位置 \(i\) 上所有事件切分出的区间数量,有 \(\sum\limits_{i=1}^n T_i=O(n+Q)\),根据上述分析经过 \(L=O(\log V)\) 轮之后本质不同的 \(c_i\) 会收敛到最多只有 \(2\) 个,因此位置 \(i\) 处的等价类数量至多为 \(2+\sum\limits_{j=i-L}^i T_j\),因此求和之后等价类的总数不会超过 \(O((n+q)\log V)\)。可以分析出平衡树的可交并的交错次数也是这个量级,因此总时间复杂度是 \(O((n+Q)\log V\log Q)\) 的。注意实现时要枚举等价类然后找分割点,否则切割次数可能会假掉。

NOICA #21

T3 mango(贪心、长链剖分)

难度 \(\color{brown}{3}\),赛时通过人数 \(3\),未做出,得分为 \(20\)。

我们要求的就是 \(m\) 条链覆盖,价值为链上边权和。显然最优解中所有链一定从叶子往上延伸。考虑 \(u\) 的儿子 \(v_1,v_2,\dots,v_t\),点 \(u\) 能够选择一个子树内部有被选叶子的儿子接一条链,设内部有叶子的儿子构成集合 \(S\),那么 \(u\) 带来的贡献就是 \(\max_{i\in S} w_i\)。现在问题转化成:

选择 \(m\) 个叶子,每个点带来的贡献是 \(\max_{i\in S_u} w_i\),最大化贡献和。

我们发现这个 \(\max\) 不好处理。不妨先把 \(w\) 升序排序为 \(w_1\le w_2\le\dots \le w_t\),这样如果钦定最大的有叶儿子为 \(i\) 则会造成 \(w_i\) 的贡献,同时限定只有 \([1,i]\) 中的子树有叶子。考虑用差分转化,构造 \(t\) 个检测器,第 \(i\) 个检测器表示若 \([i,t]\) 中存在子树有叶子,则造成 \(w_i-w_{i-1}\) 的贡献。假设最深的有叶儿子为 \(i\),那么 \(\le i\) 的检测器都被触发,造成的贡献总和恰好为 \(w_i\),与实际贡献吻合。不妨建立 \(t\) 个虚点表示这些决策,虚点 \(k_i\) 表示 \([i,t]\) 中有儿子被选择。进行如下构造:令 \(k_i\) 向 \(k_{i+1}\) 和儿子 \(v_i\) 连边,为 \(k_i\) 设置点权 \(c_i=w_i-w_{i-1}\)。

在这棵新树上原本的边权覆盖转化成了点权覆盖。因此问题变成:

求 \(m\) 条链覆盖能够得到的点权和最大值。

这个就是经典问题了,有一个显然的贪心就是每次选择贡献最大的点,发现这个过程等价于按边权为权重进行长链剖分,然后取前 \(m\) 大的长链。你当然可以直接将树显式的建出来进行长链剖分。

但是进一步分析可以发现不用真的把虚点建出来,考虑向上合并时长链信息如何更新。令 \(d(u)\) 表示已经合并进点 \(u\) 的儿子往下延伸的链长。按 \(w\) 从大到小遍历儿子,转移形如:\(d(u)^\prime\leftarrow \max(d(v_i),d(u))+w_i-w_{i-1}\)。在转移过程中顺带把所有长链也找到了。

此题要求线性,因此不能对每个 \(u\) 都 sort 其儿子,直接在外面基数排序一次就行了。求答案涉及到前 \(m\) 小的和,用 nth_element 即可做到线性。因此总时间复杂度 \(O(T(n+\mathrm{RadixSort}(V)))\)。

upd:这个做法如果写的不好看是会被卡常的,注意不要用 vector 存每个点的儿子,改成按照 \((\mathrm{fa}_u,w_u)\) 的双关键字基数排序,这样每个点的儿子体现在排序数组上就是一段连续区间。

NOICA #22

T1 monkey(计数)\(\star\)

难度 \(\color{lightgreen}{0}\),赛时通过人数 \(80\),未做出,得分为 \(50\)。问题很大。

注意到这个限制的等价表述就是选择的每个数只能作为前缀最小值或前缀最大值存在。

据此可以设计 \(dp_{i,L,R}\) 表示现在的最小最大值,但这个 dp 很蠢不好优化。

跳出来重新观察整个形态,考察第一个数之后,把整个值域分成了上下两部分,关键观察:上下两部分独立。

并且容易发现上面是上升子序列,下面是下降子序列。对这个形态计数即可。

T4 rotate(点边容斥,线段树)

难度 \(\color{brown}{3}\),赛时通过人数 \(0\),未做出,得分为 \(0\)。

考虑如何刻画 \([L,R]\) 在线段树上覆盖的极大区间个数。思考什么是好求的,被 \([L,R]\) 完全包含的区间数是平凡的。让线段树上每个非叶节点向儿子连边,不难发现原问题就是这棵树上被 \([L,R]\) 完全包含的所有节点构成的连通块数量。经典的,考虑点边容斥,设 \(m\) 表示非叶节点被完全包含的个数,这样 \(|V|=m+(r-l+1)\),除了叶子的每个节点都有向下的恰好两条连边,把叶子扣除掉就是 \(|E|=2m\),于是连通块数 \(C=|V|-|E|=(r-l+1)-m\)。

直接上树套树求 \([l_u,r_u]\subseteq [L,R]\) 的数量可以做到 \(O(q\log^2 n)\),空间也是 2log,无法接受。如果将其强化到动态二维偏序就不能更进一步了。但我们的区间是有很优秀的性质的,不妨再容斥一步把包含转化成不包含,有 \([l_u\ge L\wedge r_u\le R]=1-[l_u<L]-[r_u>R]+[l_u<L\wedge r_u>R]\)。中间的两个一维偏序容易用树状数组解决做到单 log。最后一个条件等价于线段树区间是 \([L-1,R+1]\) 的超集。这个东西的性质就很好了,在线段树上找到最深的包含 \([L-1,R+1]\) 的区间 \([l_u,r_u]\) 后答案就是 \(u\) 的深度。点 \(u\) 其实就是编号为 \([L-1,R+1]\) 的叶子的 \(\mathrm{lca}\),区间 lca 由 [NOIP2024] 树上查询 其实就是 \(\mathrm{lca}(i,i+1)\) 深度的最小值。对点深度拆贡献,区间 \([L,R]\) 会对 \(i\in [L,R)\) 的 \(\mathrm{dep}(\mathrm{lca}(i,i+1))\) 造成 \(1\) 的贡献。因此用一棵线段树维护,加删区间体现为区间 \(+1,-1\),查询区间最小值,容易做到单 log。于是总时间复杂度 \(O(q\log n)\),空间复杂度线性。

posted @ 2026-11-04 20:56  STDJCY  阅读(17)  评论(0)    收藏  举报