又一做题记录
07.09
CF1874E Jellyfish and Hack
你考虑关心值域序列,那么每次选出的都是一个连续区间,然后挑出其中下标最小的划分,这样区间都是连续的。
考虑一个暴力的区间 DP,设计 \(f(l,r,v)\) 表示值域区间 \(V[l:r]\) 产生的价值为 \(v\) 的下标分配方案数,转移为:
中间那个二项式系数是因为要把两个值域区间的下标值合并起来,然后 \(k\) 这一位放最前面。
你发现长度相等的区间本质相同。于是可以写作:
如果将 \(f(l)\) 视作多项式的话次数是 \(O(n^2)\) 的。直接拉插做在 \(O(n^6)\),虽然很跑不满但是显然过不去。
注意到是卷积形式,考虑生成函数,设 \(F(l)=\sum_{i}f(l,i)x^i\),那么转移就是:
你注意到 \(F(l)\) 的次数仍是 \(O(n^2)\) 的。很有趣的是你可以直接代 \(n^2\) 个数进去得到其点值表示法,然后单次乘法就是 \(O(n^2)\) 的了。
最后你插回系数表示法即可得到 \(f(n)\) 的点值表示法就做完了。复杂度 \(O(n^4)\)。
07.11
P10653 [ROI 2017] 存储器 (Day 2)
首先若 \(t\) 分界位置不为 \(s\) 子集必然不行。
你考虑按 \(t\) 分界划分为若干子任务处理。问题转化为要将一个区间合并成一个颜色。注意判定过程中区间交界处的片段不可被操作否则会连接两个区间。
长度更大的可以合并长度更小的,则选非目标色进行操作不优,那么直接链表 \(O(n)\) 模拟即可。
P13252 [GCJ 2014 #1B] The Bored Traveling Salesman
条件可以描述为一棵生成有根树。要求相当于最小化字典序。
那难道不是直接一次 BFS 就好了吗?考虑如果一个点存在子树与外界断连,那么它就必须把那个子树走完再回退。
我们需要得知回退之后下一步会到哪一个点来确认是否要回退。你发现 \(n\) 足够小所以你可以直接一路回退模拟一遍直接找到可行的最小点。这部分复杂度 \(O(n^2)\)。
然后你发现判断连貌似也有些繁琐,然而 \(n\) 足够小所以每次从头搜一遍即可,题解里声称搜索一遍是 \(O(n)\) 的不懂,反正 \(O(n^4)\) 的复杂度也是可以接受的。
P3626 [APIO2009] 会议中心
若干线段,选出尽可能多的不交线段,在所有可行方案中输出线段编号集合字典序最小的。
忽略字典序要求的话是一个经典问题,每次选可行的右端点最小的线段即可。
一个思路是从小到大贪心,每次判定选当前线段后能否仍能达到最大值。
选一个线段相当于将其所在区间分为两部分,如果能直接得到区间价值的话就很好。你发现原问题的贪心策略是容易倍增的,故而区间价值可以单次 \(O(\log n)\) 求。用 map 之类的维护一下连续段即可。
P6908 [ICPC 2015 WF] Evolution in Parallel
首先如果存在串不是主串的子串显然无解。然后就是要将所有给定模式串分成两条子串关系偏序链。
显然首先按串长排序。考虑子串判定应该只能 \(O(n)\),没有优化空间。
一个暴力就是 \(f(i,j)\) 表示两序列结尾为 \(i,j\) 是否可行,转移只需要考虑下一个串放哪个序列即可,\(O(n^3)\)。
钦定 \(i>j\),那么若存在 \(s_{k}\not\sub s_i\),则 \(f(i,j<k)=0\)。同时,若 \(f(i,j)=1\),则 \([j+1,i]\) 成链。
所以你发现真正有用的只有最小的满足 \(f(i,j)=1\) 的 \(j\) 以及首个包含 \(j\) 的 \(k\)(若存在),对每个 \(i\) 维护 \(g(i)=j,h(i)=k\) 即可,若 \(s_i\sub s_{i+1}\) 则 \(g(i+1)\gets g(i)\),否则合法仅当 \(s_{g(i)}\sub s_{i+1}\lor s_{h(i)-1}\sub s_{i+1}\) 此时 \(g(i+1)\gets i\),否则不合法。
P13385 [GCJ 2011 Finals] Ace in the Hole
神秘困难构造题,都怎么做出来的。
考虑按时间构造。只需保证任意时刻无法确定任何位置必然不为 \(1\) 即可。
如果之后还有未知数,设当前是第 \(k\) 个未知位置,那么为了让最后一个空位也可能为 \(1\),当前位置上的数只能为第 \(k+1\) 小的未知数,如果大了后面必然有另一个比它小的数,如果小了必然有一个比它大的数在它前面。
那如果之后没有未知数了呢。
我们姑且忽略已知数,视作一个 \(1\sim n\) 的未知序列,第一次查了位置 \(n\)。
首先不可返回 \(<n-1\) 的数。对 \(n\le 3\) 显然成立,否则由上文,你此后查位置 \(k<n-1\) 的结果都是一定的(只要不查位置 \(n-1\)),考虑查得只剩下 \(n-1\) 和 \(n-3\),此时 \(n-2\) 位置上的值必然为 \(n\),两个未知数分别为 \(1\) 和 \(n-1\),那么 \(n-1\) 位置上不可能是 \(n-1\),故而答案提前确定,不合法。
在此情境下可以任意返回 \(n-1\)。然而带回原情景,假如此前已知了第二大未知数 \(y\) 与第一大未知数 \(x\) 之间的数 \(z\),这个位置就只能填 \(x\)。考虑反证,若 \(z\) 之前仍有未知数,则其必然不为 \(x\);否则,\(z\) 及之前的所有数形成 \(2\sim z+1\) 的顺序排列,第二大未知数只能是 \(1\),不得返回。
最后只需证明没有这一情况时必然可以填次大未知数。首先只剩两个空的情况肯定要特判一下。否则,你考虑按上述策略生成的当前位置之后的已知后缀,其值域要么连续,要么只有一个数空了出来,你在这里填入次大未知数相当于把那个数继续留下,显然不会形成非法情况。
题目保证存在合法情况,所以证完必要性就不证充分性了。
按上述策略模拟能填次大值就填否则填最大值即可。由上文知填次大值实际上就是把更大那个空往前挪,显然最大化字典序。
ABC466F Many Mod Calculation
你考虑最后再把 \(0\) 去掉。容易只保留降序的 \(a\)。那么对一个数 \(x\),你考虑找到首个小于 \(x\) 的 \(a\),将 \([0,x]\) 划分成长 \(a\) 的若干整段和最后一个余段,前面整段的答案是一样的,直接代一个做子问题乘上段长即可,然后再把余段的贡献加上。
这个东西可以直接记搜,由连续取模的经典结论知子问题个数是 \(n\log V\) 的。最后复杂度两只 \(\log\)。
赛时少打了一个 a[],气笑了。
07.12
ARC086E Smuggling Marbles
你考虑对每个点的弹珠计算它被放入箱子的方案数。也就是说,它要能到达根节点的父亲。发现你只需关心与其同深度的所有点。
一个暴力是 \(f(x,h)\) 表示子树 \(x\) 内深度为 \(h\) 的点可以走出子树的放法数。转移的话枚举那个点来自的子树,剩下的子树全都走不出来。
对每个深度拉一个虚树出来就做完了。也可以长剖做。
P11847 [USACO25FEB] True or False Test P
你考虑 E 必然会操作 \(a_i+b_i\) 最大的 \(k\) 个数。故而答案实际上就是选中的 \(a\) 之和减去 \(a+b\) 最大的 \(k\) 个值。
不妨先按 \(a+b\) 排序,然后钦定一个分界,在分界后选 \(k\) 个 \(b\) 最小的,然后把分界前所有 \(a\) 都选上。对于一个 \(k\),容易倒着扫描线维护优先队列。
现在要对所有 \(k\) 计算答案,后缀信息容易主席树维护。你发现 \(k\) 增大分界不右移,决策单调性直接分治即可。复杂度 \(O(n\log^2n)\)。
QOJ12118 Dendrology
你考虑对每条边计算其被几个生成树所包含。只需同时满足子树内与子树外均存在点即可。不妨容斥,求只包含子树内或子树外的区间数。
你对 \(p\) 维护连续段,单次加点容易直接得到贡献。dsu on tree 即可。
考虑修改操作。你发现只会影响这条边的答案,相当于其序列上两次翻转。
但不可能把所有边的序列存下来。你发现不同边的修改互不影响,所以你可以直接把修改在 dsu on tree 过程中处理,做一个时间轴差分即可。
P6009 [USACO20JAN] Non-Decreasing Subsequences P
注意到 \(k\) 异常小。设计 \(f(i,j)\) 表示考虑到 \(i\),上一个数是 \(j\) 的选数方案数。转移就是 \(f(i,a_i)\gets \sum_{j\le a_i}f(i-1,j)\),其余维度继承。
考虑区间查询呢。你发现倒着做也是容易的,把两段序列进行一个拼接也是容易的,所以直接挂上猫树即可。
但是空间爆了。把询问离线下来即可。
P3251 [JLOI2012] 时间流逝
状态与元素序列成双射,转移成树状。
超过阈值的集合均不能往回走且为叶子,其余都是双向边。集合总个数实际上是不多的,跑一下大致在 \(10^6\)。
设计 \(f(x)\) 表示到达点 \(x\) 的期望天数,你发现叶子很不好处理,考虑转而设计为从 \(x\) 到达叶子的期望天数。
直接高消显然爆了。对于这类树上消元问题,一个技巧是将 \(f(x)\) 表示为关于 \(f(fa_x)\) 的一个一次函数 \(kf(fa_x)+b\),到根节点时就有 \(f=b\),然后如果需要依次往下代入即可。
我们记 \(sk_x=\sum_{y\in son(x)}k_y,sb_x=\sum_{y\in son(x)}b_y\),移项得到:
就做完了。注意根节点时特殊有 \(P=0\)。
CF1096E The Top Scorer
首先总方案数可以一个组合数搞定。
获胜方案数呢?类似地,枚举 \(r\)(后文 \(r\) 均指钦定 \(a_1=r\)),然后再枚举有 \(p-k\) 个 \(r\),考虑求剩下的 \(k\) 个任意分配值全都小于 \(r\) 的方案数。
考虑生成函数。
复杂度 \(O(sp^2)\)。
07.13
P11534 [NOISG 2023 Finals] Inspections
注意到每次相当于给一段区间赋值为一个等差数列状物,考虑到各点是独立的,我们不妨使用这条斜线段的纵截距统一描述整段的时间,这样一次操作就相当于一次区间覆盖,直接颜色段均摊,对答案维护一个后缀差分数组即可。
P11535 [NOISG 2023 Finals] Airplane
注意到答案显然形如一段上升和一段下降。我们先考虑上升段。
显然高度尽量高不劣,因此我们每一秒都上升高度,这样一个点的距离即为到达该点时的高度,然后容易模拟题意跑一遍最短路,记本次得到的距离信息为 \(f\)。同理从 \(n\) 开始跑一遍,得到距离数组 \(g\)。
我们考虑在路径最大值处更新答案,点 \(x\) 的贡献为 \(2\max(f(x),g(x))\)。但这样不一定是优秀的,因为你在一侧额外多往上飞之后,会在另一侧产生额外的下降代价。所以我们还要考虑一段平飞段。
然后一个关键性质是平飞段性质小于 \(2\),否则可以转化为一个上升和一个下降。所以只需要再枚举有向边即可,\((u,v)\) 的贡献为 \(2\max(f(u),g(v))+1\)。
P11536 [NOISG 2023 Finals] Curtains
考虑扫描线,每次加入以当前 \(r\) 为右端点的线段,对每个 \(l\) 维护从它能连续到达的最远距离,初始设为 \(l-1\)。
修改形如对一段区间内,原来值在 \([l,r]\) 之间的数全部改为 \(r\)。我们考虑对这个东西打标记 \((l,r)\)。考虑合并标记,首先新的 \(r'\) 肯定比原来的 \(r\) 大,假如 \(l'\le l\) 就可以直接把原来的 tag 删了,否则假如 \(r\in[l',r']\) 就可以合并成标记 \((l,r')\),但你发现剩下的情况不好做。
注意到你只需要单点查询,并且无法合并的 tag 形如值域上的不交区间,所以考虑标记永久化,对每个点存一个标记栈维护这些区间,查的时候一路回溯,用返回值在标记栈内二分找到包含它的区间并更新其信息即可。复杂度两只 \(\log\)。
优化:注意到无法合并你就可以直接不管新的 tag 了,因为原来打了 tag 的地方里面所有值都是不超过原来 tag 的 \(r\) 的。所以可以做到一只 \(\log\)。还有一种思路是扫描线对每个点维护能包含它的最大左端点,查询只要区间 \(\min\) 不小于给定左边界即可,也是一只 \(\log\)。
P6235 [eJOI 2019] 矩形染色
黑白染色后黑白是独立的。只考虑一种颜色。
你发现可以描述为,如果一个第一类对角线不选,其对应的所有第二类对角线都要选。一个关键性质是,其对应的是一个连续区间。
故而我们可以直接转化成序列线段问题,选一些点,一个区间产生贡献仅当其内所有点都被选,最大化区间贡献和减点权和。容易写一个平凡的 DP 然后扫描线优化即可。
P9985 [USACO23DEC] Train Scheduling P
最后的调度方案可以描述为若干时间段 \([l,r]\) 交错表示左向和右向列车此刻行驶。满足 \(l_{i+1}=r_i+T\)。列车 \(i\) 产生的代价为首个 \(l\ge i\) 的同色段 \(l-t_i\)。
易知有效的时间段划分方案满足,每个段右端点必然为其颜色某个 \(t_i\) 加上若干个 \(T\)。为某个 \(t_i\) 是因为通常情况下如果右端点超出去了那往回挪到这个 \(t_i\) 不劣,加若干个 \(T\) 是因为可能上一个段太近挪不回来所以表现为上一个段末尾加 \(T\)。
考虑摈弃时间轴,维护两个站的列车序列,分别将 \(t\) 按序记为 \(a,b\) 两数组。
考虑一个 DP \(f(i,j,0/1)\) 表示现在已经送出了 \(a\) 站前 \(i\) 车与 \(b\) 站前 \(j\) 车,当前是 \(a/b\) 站出发段,仍需多少时间。转移是容易的,以 \(a\) 为例,不结束段有 \(f(i,j,0)\gets f(i+1,j,0)\),结束本段,若 \(b_{j+1}\ge a_i+T\) 则直接 \(f(i,j,0)\gets f(i,j+1,1)\)。
但若 \(b_{j+1}<a_i+T\) 我们就需要考虑直接加 \(T\) 的方案,这一步直接模拟,显然加 \(T\) 次数不超过 \(n\) 因为每次加都说明对方有点被包含其中。这样单次转移就达到了 \(O(n)\),复杂度 \(O(n^3)\)。
考虑优化,你发现对于一个点 \(i\),它的跳 \(T\) 过程是一定的,故而你可以只跑一遍最后一个合法的 \(b_k<a_i+T\) 的 \(k\),往前依次增添贡献即可。复杂度 \(O(n^2)\)。
gym103371I Organizing Colored Sheets
显然只需要对每个 \(h\) 维护最大的可行 \(w\) 即可。你考虑一个大小可行如何判定。
因为可重所以显然任意能铺就铺。考虑对于每个点判定,假如所有包含它的放法都不合法,那就铺不满。然而这个判定并不很有建设性。
注意到,只需要所有挨着边界与障碍的点均可被包含,则该尺寸合法。
枚举四个方向,你对每个点预处理当前方向意义下其上下最近障碍,然后横着顶到头也要更新一下,最后合并得到的信息计数即可。整合信息直接对非法情况二维前缀和即可。
07.14
QOJ3687 Boss 单挑战
你发现回血、普攻、法攻是独立的。换句话说,只要长度一定,普攻和法攻产生的攻击是一定的,与其在原序列上的位置无关。所以你可以先 \(O(n^2)\) 暴力 DP 出普攻和法攻各长度的贡献然后卷起来。
那么只需要考虑最小化回血即可。我们从前往后枚举回合,如果当前空位足够结束游戏就输出,否则我们需要保证剩余血量超过 \(a_i\),显然之前设定的回血回合全部保留,你从后往前将空位设定为回血回合,对每个位置维护从开头到这里时剩余的血量,最大血量与之的差的后缀 \(\min\) 就是在某一个回合额外加血能对回合 \(i\) 时的血量产生的贡献。
P4074 [WC2013] 糖果公园
树上带修莫队板子。
P10070 [CCO 2023] Travelling Trader
\(K=1\) 是简单的,树形 DP 找一条链即可。
\(K=3\) 你发现必然有解做完全部,搜一遍奇数层做完再往下偶数层回溯前再做即可。
\(K=2\) 考虑树形 DP。你设计 \(f(x,0/1)\) 表示 \(x\) 子树回到 \(x\) 父节点,需要先操作 \(x\) 或者回溯前再操作 \(x\) 的最大价值。\(g(x,0/1)\) 则表示 \(x\) 子树不考虑回到父亲,\(x\) 是否需要最先操作的最大价值。
一共有七种转移,维护一些信息的最大值、次大值、第三大值即可做到 \(O(n)\) DP。输出方案只需记录一下转移过程然后按转移思路模拟即可。
P11369 [Ynoi2024] 弥留之国的爱丽丝
由追忆知有向图连通性只能 bitset 实现。
考虑操作分块。
你一个块内只会关系到 \(O(B)\) 个点和边,不妨先忽视这些边缩点,你发现只需要维护每个点到这些关键点的可达性,单次重构即可做到 \(O(n+m+\frac{(n+m)B}{w})\)。
查询就不断加入当前黑色的关键边,每条 \((x,y)\) 形如 \(u\to x\) 就将 \(y\) 的可达点集或予 \(u\),这样每条边只会在其 \(u\) 加入的时刻贡献一次,单次询问 \(O(\frac{B^2}{w})\)。
故而复杂度为 \(O(\frac{(n+m)q}{w}+\frac{(n+m)q}{B}+\frac{B^2q}{w})\)。取 \(B=\sqrt[3]{(n+m)w}\) 即可。
QOJ7603 Mex on DAG
你考虑描述一条 \(\mathrm{mex}> v\) 的路径。也就是其包含 \([0,v]\) 中所有权值的至少一条边。
你考虑判定这样一条路径是否存在。你发现这充要于存在 \([0,v]\) 中每个权值选一个边的选法,使得选出的边两两可达。边的可达性容易预处理。
注意到每个权值只有两条边,因此可以转化成一个 2-sat 问题。二分答案即可。
QOJ914 分身术
你先考虑如何判定一个集合的区间能分配成无交 \(k\) 组。按右端点升序放区间,你发现每次贪心地放入已有区间右端点尽可能大的组即可。
接下来你考虑对一个 \(k\) 求其最优选取集合。你发现直接按右端点升序枚举区间,按上述贪心策略能放就放即可。你发现你大可不在意具体放入哪个区间,因为能放相当于区间最大覆盖数量不超过 \(k\),只需维护区间最大覆盖数即可。
你考虑如何快速处理该过程。考虑按 \(k\) 升序计算答案,每次找到最远的最大覆盖次数恰为 \(k\) 的位置,然后找到其右侧最小的 \(r\) 对应区间将之加入。显然一共只会找 \(O(n)\) 次,用线段树维护即可,\(O(n\log n)\)。
07.15
QOJ5507 Investors
你注意到每次给一个后缀加不劣。那你每次都加一个足够大的值抹平两段间的所有逆序对不劣。
所以现在就是要选出 \(k\) 个分界点,最大化经过这 \(k\) 个点的线段数。设 \(f(i,j)\) 表示前缀 \(i\) 选了 \(j\) 个点钦定选 \(i\) 的方案,线段贡献在其右端点处计算。
你发现这个东西是有决策单调性的,\(i\) 增大最优的 \(j\) 不可能减小。最右边那个如果离线扫描线的话就做成了区间覆盖,你直接扫一遍预处理出所有 \(n^2\) 组 \(i,j\) 的答案即可。复杂度一只 \(\log\)。
实际上有简单的多的做法,你直接对没覆盖点的线段数 DP,你发现每次只需要求区间逆序对数就可以了,然后决策单调性一只 \(\log\)。
QOJ5367 递增树列
你发现,lca 序列形如从根开始到某个叶子的一条链,当 lca 变化时,原 lca 子树内其他点必须已经全部添加进序列。故而容易考虑设计 DP \(f(i,j)\) 表示子树 \(i\) 中有 \(j\) 个点是在 lca 在子树内时贡献的,也就是剩下的 \(i-j\) 个点都在祖先时被使用了。
考虑转移,枚举下一个 lca 所在子树 \(y\),你要解决的就是将若干个各有一定数量的小球种类排成一排方案数,使得两两相邻不同色。可以对这个直接容斥,也可以维护 \(g(i,j)\) 表示序列中现在有 \(i\) 个不同色邻对和 \(j\) 个同色非法邻对的方案数,两者显然都是逐个考虑剩下子树合并信息。
理论上可以做到 \(O(n^4)\),但我也不知道我最后那一坨挺快的代码复杂度是多少。
P6684 [BalticOI 2020] 小丑 (Day1)
你考虑有无奇环如何表示。你发现无奇环等价于为二分图,即可以黑白染色。
考虑维护题目询问。考虑对每个 \(l\) 维护最小的 \(r\) 满足只考虑 \([l,r]\) 内的边,存在奇环。原询问你考虑将序列倍长就变成保留连续区间。
你发现 \(r\) 关于 \(l\) 单调递增。考虑整体二分,可撤销并查集维护黑白染色即可。
07.16
[NOIP2026 模拟 R2] 友谊赛
你考虑每次选祖先中尚未确定的点最多的赋最大值即可,贪心策略容易调整法证明。
考虑实现,你拿一个线段树维护所有叶子的上述信息,实际上就是叶子深度减去最近的已确定祖先的深度,线段树维护区间加,每个点只会修改一次所以可以暴力跳,每次修改只有一个子树已经有值所以两次区间加即可。
[NOIP2026 模拟 R2] 数数 / QOJ5530 No Zero-Sum Subsegment
你考虑判定一个序列是否合法,维护前缀和,只需判定前缀和中有无重复元素即可。
考虑计数,对前缀和折线计数,有若干次 \(-2,-1,+1,+2\) 走法,要求不能走到重复点。经过手摸发现,倘若我们要求终点在零之上(在零之下是对称的可以互换 \(a,d,b,c\) 直接做),那么最终形态形如开头一段向下的谷,中间一段上升,和最后一段向上的谷。
开头的谷形如,先向下走若干个 \(-2\),然后走一个 \(+1/-1\),然后向上走 \(+2\) 走回 \(1\) 的位置。末尾的谷是类似的,为了防止与中间的上升部分算重,不妨钦定最终结束的位置必须为谷开始位置加一。注意特判没有谷的情况,可能一个 \(-1\),或者直接进入上升部分或结束。
上升段三种走法,\(+1\),\(+2\),\(+2-1+2\),你需要将 \(-2\) 在谷中消耗完,所需的元素一定,这三种走法个数也一定,直接一个可重集排列即可。
[NOIP2026 模拟 R2] 跳棋 / QOJ1811 How to Move the Beans
考虑 SG 函数。你发现 SG 函数值不超过 \(3\)。所以直接 DP 即可。有 # 的行是好做的。没有 # 的行你发现每个点至多走回到自己后面一位,考虑将序列拆成前后缀分别 DP 然后拼合起来,比较平凡。
[NOIP2026 模拟 R2] 波动 / P8476 「GLR-R3」惊蛰
首先显然有用的值只有给定的 \(a\) 否则不优,容易有一个 \(O(n^2)\) DP。
考虑优化,直接放到线段树上,你要动态维护后缀 \(\min\)、区间加、区间加各自离散化后的值。第二者是最好做的,对于第三者,你打一个标记,因为两个序列都是单增的,所以新的最大值只需加上右端点离散化前的值即可。
考虑维护后缀 \(\min\),你发现现在相当于是按 \(a_i\) 划分成了左右两个单增序列,在左边线段树上二分找到首个比 \(a_i\) 位置值大的然后区间推平即可。
QOJ8109 Postcards / Przesył
如果不强制在线,考虑操作分块,每块把相关的边都去掉跑一遍并查集,只会有 \(O(B)\) 个块与它们之间的连边,对每个询问跑 tarjan 即可。
但是强制在线了。你发现 \(r\) 很小,考虑做与 \(r\) 有关的复杂度。你发现可以拉出一棵 dfs 生成树,你删完至多 \(r\) 条被修改的树上边之后,dfn 序列会被划分为 \(O(r)\) 个区间,每个区间内部都是连通的。考虑判定区间间连通性,你发现区间间连边数是易得的,那么容易得到每对区间的连边关系,跑一遍 tarjan 即可。
[hidden] JPC
你考虑对一个树的形态求 \(p\) 的个数。只有 \(n\) 对大小限制,并且不成环。你定义 \(f(i,j)\) 表示子树 \(i\) 中有 \(j\) 个点排在 \(i\) 前面的方案数。那么合并是容易的,可以枚举 \(u\) 插入的位置,前缀和优化,复杂度树上背包 \(O(n^2)\)。
你考虑对一个树的形态高效地计算其权值。考虑组合意义,就是从每个点的连通子树中选一个点贡献权值,贡献为乘积。你可以对每个点钦定它贡献给了 \(j\) 个祖先。然后转移应该是容易的。所以再开一维钦定点数跑 DP 就做完了。\(O(n^4)\)。
07.17
P9262 [PA 2022] Łamigłówka
两次有效操作之后就会到一个角上。然后接下来就是在四个角上挪动。
你发现任意时刻在四个角上图形的形状是不变的,只是旋转后一个块可能不在原来的位置。被增预处理出某个位置在某个角上转几次后到达的新位置即可。
QOJ7012 Rikka with An Unnamed Temple
权重模 \(k\) 为 \(t\) 想不到什么好的处理方法,考虑直接加一维状态。
现在要求所有禁行点的方案。你考虑拿总方案减去经过了禁行点的方案。从 \(1,n\) 各跑一遍即可。但这样是错的,因为假如所有最优路径都经过了当前点那么答案的最大值变化了。
考虑所有不经过 \(x\) 的路径必然存在唯一一条边从拓扑序比 \(x\) 小的指向拓扑序比 \(x\) 大的,枚举边区间加即可。注意处理 \(1\) 走不到的和走不到 \(n\) 的点。
QOJ6538 Lonely King
你注意到你的操作形如对一个根,枚举它所有仍连通的子树,从每一个里面选一个叶子将它们间的路径删了缩成一边,不劣。
一个暴力是定义 \(f(x,i)\) 表示子树 \(x\) 预留点 \(i\) 给其祖先,转移相当于对每个点枚举了其子树内所有叶子,复杂度 \(O(n^2)\)。
考虑转移 \(x\) 时,除了其选定的叶子,其余子树的贡献形式为 \(\min_i f(y,i)+C_xC_i\),容易考虑李超线段树维护,过程中只需额外支持全局加和线段树合并即可。
P9260 [PA 2022] Miny
只能考虑将所有引爆关系连边跑可达性统计。考虑点分治,块内距离定义为到根距离和,显然算重不用管,\(d_i+d_j\le r_i\iff d_j\le r_i-d_i\),直接前缀优化建图,最后可达性上 bitset 发现空间有点爆,分个块每次只跑块内点即可。
07.18
QOJ14310 Moving on the Plane
考虑转切比雪夫距离分离两维,那么现在就是要求所有点都在一个正着的矩形内,显然你只需关心其左边界和下边界,枚举编号最小的在边界上的点,然后枚举所有点求一下方案数即可,前缀和优化做到 \(O(nm)\)。
QOJ16332 Efficient Express
首先大可忽略所有 \(\exists j,\forall a_i=c,p_j\ge i\land x_j\le i\) 的 \(c\)。显然对每个颜色 \(i\) 你只关心其最左边和最右边的点能否连通,记作 \(l_i,r_i\)。那么每个 \(i\) 都需要存在一个 \(j\) 满足:
那么 \(l_j> l_i\land j>i\) 的 \(j\) 就可以忽略了。考虑视作点 \((p_j,x_j)\) 和 \((l_i,i)\) 拍到坐标系上会直观一些。
考虑容斥求不合法方案数。你考虑去枚举最小的不合法的 \(i\) 记作 \(t\),则需要保证所有 \(<t\) 的均合法,考虑容斥。
存在一个性质是,只关心 \(x_j\le i\land y_j>i\) 这一不合法条件,你发现 \(i\) 越大越严苛。因此对于比一个不合法点小的点,其这一判定必然不合法,其合法性判定只需关心 \(p_j<l_i\) 的点。
故设 \(f(i)\) 为钦定 \(i\) 为最小的不合法点的带系数方案数,转移枚举之前钦定的位置,\(f(t)\) 直接把所有相关点都钦定掉,对每个比 \(t\) 小的 \(i\):
\(t\) 的贡献即为:
QOJ9798 Safety First
萌萌根号分治。见这里。
P12486 [集训队互测 2024] 木桶效应
考虑组合意义。一个排列组的价值等价于给每一列赋一个权值 \(val\) 满足 \(val_i\le p_{j,i}\) 的方案数。
先考虑 \(q=0\) 的情况。
考虑对一个 \(val\) 序列求 \(p\) 方案数,你升序枚举 \(i\),然后对每行确定填入 \(i\) 的位置,只需知道有 \(j\) 列的 \(val\le i\) 即可得方案数为 \((j-i+1)^m\)。容易设计 \(f(i,j)\) 表示考虑到 \(i\) 有 \(j\) 列 \(val\le i\) 的方案数。
考虑 \(q\ne 0\) 的情况。
你注意到 \(q\) 足够小。考虑状压存在钦定点的列,每次转移都将存在钦定点的行列与其他行列分开考虑。设计 \(f(i,j,S)\) 表示考虑到 \(i\) 有 \(j\) 无钦定列 \(val\le i\) 且 \(S\) 中的有钦定列 \(val\le i\) 的方案数,先不考虑 \(i\) 的贡献把 \(i-1\) 的信息转移过来,再对各个状态计算本 \(i\) 中各行的选法贡献即可。
有钦定列转移需要枚举 \(S\) 子集,处理完无钦定列转移后跑一遍高维前缀和即可。对各个有钦定行你对每个 \(S\) 维护其在 \(S\) 中且值比当前 \(i\) 大的列数,转移的时候其系数即为无钦定行系数减去该值,跳过已经钦定了 \(i\) 的行。复杂度 \(O(n^22^q(n+q))\)。
07.19
[hidden] 重置
你注意到 \(val\) 的限制是很强的,只能考虑暴力维护连续段。
考虑前面部分,你发现随区间长度增大 \(\min\) 递减 \(\operatorname{mex}\) 递增,所以可以考虑扫描线然后维护分界点,你注意到这个分界点也是单调右移的。
考虑深挖 \(\operatorname{mex}\) 性质,经典地,极小 \(\operatorname{mex}\) 区间只有 \(O(n)\) 个,找出它们后就可以得到 \(O(n)\) 个扫描线区间覆盖操作维护 \(\operatorname{mex}\)。类似地 \(\min\) 的维护可以单调栈变为 \(O(n)\) 个区间覆盖。
考虑得到上述所有操作后进行扫描线维护分界点,用两个 set 维护分界点前后的连续段,分界点移动就加入单点,区间覆盖只执行分界点一侧的部分即可。考虑区间覆盖作用,相当于给长度在一个范围内的统一增添一个值,同时一个区间若不被操作则 \(r\) 每增 \(1\) 其会给长度自增 \(1\) 并贡献其值,考虑维护每段的出现时间然后在其消失时统一处理这一部分贡献,也是一个区间加值。
那么现在就是若干个区间加点维护连续段,扫描线 set 即可。
07.20
[NOIP2026 模拟 R3] 望月者计划
考虑容斥,用总方案数减去非法方案数。转化为 \(a_0=m\) 后边若干个 \(m-1\) 和 \(-1\),要求 \(i\in[1,m),a_i>0\),不妨枚举首个 \([1,m)\) 中为 \(0\) 的位置。
重点在如何求他前面一直非零的方案数。由 Raney 引理,对于一个和为 \(1\) 的整数序列,其循环位移中只有恰好一种满足前缀均为正数。
回到我们的问题,你考虑把最开始那个 \(m\) 改成 \(m-1\),那么现在总和为 \(-1\),显然等价于总和为 \(1\) 的问题(直接取反),同时合法方案首位必然为 \(m-1\) 可以直接把 \(1\) 加回来,所以直接求循环位移意义下本质不同的方案数即可。
[NOIP2026 模拟 R3] AC 自动机
显然考虑对每个状态存当前长度下在该状态的串数 \(f\)。难点在于失配后要上传到首个有这一字符转移的失配树祖先。转成计数就是,对于转移 \(\delta(x,c)=y\),转移权值为 \(x\) 子树中对 \(c\) 失配后最近的有 \(c\) 转移祖先为 \(x\) 的 \(f\) 和。
考虑容斥,用子树和减去非法元素和,你发现非法元素形如找到若干个最近的有 \(c\) 转移的子孙然后把他们的子树和减掉,你发现可以直接搜一遍动态维护每个值最近的有转移祖先,然后将当前点暴力插入相应的祖先的队列中,转移时枚举队列减去贡献。精细实现可以做到 \(O(nt)\)。
[NOIP2026 模拟 R3] 归源之仪 / QOJ14718 Meeting for Meals
做过可惜没做得及。
显然等价于最小化相遇时间。暴力就是枚举 \(i,j\) 然后枚举相遇位置,你考虑枚举相遇位置所在边,假设 \(i\to u\land j\to v\),那么只需保证相遇后不超时即 \(\min\{dis(i,u)+w+dis(v,1),dis(j,v)+w+dis(u,1)\}\le t_{\max}\) 即可,用时显然为 \(\frac{dis(i,u)+w+dis(j,v)}{2}\)。
考虑优化。你发现对于一定的 \(i,u,v\) 显然找最近的 \(j\) 即可,可以预先跑一遍多源最短路。更进一步,你发现 \(i\) 也只需要找离 \(u\) 最近的那个即可,别的 \(i\) 在 \(u\) 点和最近的 \(i\) 相遇就不劣于在 \((u,v)\) 与 \(j\) 相遇。所以只需要跑最短路然后枚举边即可。
[NOIP2026 模拟 R3] 声骸回响
注意到若 \(>1\) 的元素之和超过了 \(24\) 必然无解。那么只需考虑 \(>1\) 的元素和不超过 \(24\) 的情况。又注意到此时若序列长度超过 \(24\) 那么必然有解,你可以把 \(>1\) 的全部加起来然后选任意个 \(1\) 加上去。
那么只需要考虑序列长度不超过 \(24\) 的情况了,直接每次把路径拉出来跑暴力 DP 即可。
[hidden] 树^{数} + 树^{数} + ...
显然一棵笛卡尔树双射一个序列。考虑求序列贡献。
你发现比一个点大的数量就是走到根右转次数,正常笛卡尔树是维护右链,不妨倒着生成维护左链,那么每次加点只会贡献当前点自己的价值,移到它右子树的点贡献不变,所以只需维护链长即可。
故而直接 \(f(i,j)\) 表示加到 \(i\) 左链长为 \(j\) 的贡献和,前缀和一下即可做到 \(O(n^2)\)。
[hidden] 覆盖
DAG 中一些边能构成一个路径当且仅当两两可达。必要性显然,充分性考虑构造证明,维护一条路径然后加入边,他必然可达一个后缀并被一个前缀可达,插入交界点处即可。
07.21
P5476 [CCO 2015] 挖掘
先不考虑蛋求每个区间的贡献,容易考虑二维前缀和,注意到每个种类的点数足够小,所以直接枚举 \(2^S\) 种选取情况容斥即可。再考虑蛋,只需对每个区间求出其贡献消失的时刻,形如一个二维矩形最小值,扫描线标记永久化挂 set 维护即可。最后再对时间轴扫描线并处理回答,显然权值不超过 \(m\) 放线段树上维护区间和就做完了。
QOJ5363 ZYB 的游览计划
考虑计算一段的价值。经典地,按 dfn 排序后求出两两相邻距离即可。容易发现决策单调性,最优决策点单调右移。考虑分治,段的价值可以莫队 set 维护。
P10544 [THUPC 2024 决赛] 转化
你考虑建图跑一遍缩点,但由于一个点只能选一种转化所以 SCC 内并非单纯的无穷多。可以描述为以下情况:
考虑一个有值的点:若其存在一种转化生成至少两个本 SCC 的点,那么本 SCC 可以到达无穷;若其存在一种转化生成一个本 SCC 的点和若干外界点,则这些外界点及它们的可达点均可到达无穷;剩下的转化只有两种,要么全部连向外界点,要么只有一条边并连向本 SCC 的点。
考虑维护每个 SCC 内的点能否无限生成,额外打一个标记即可,直接按上述规则更新,同时将其所有后继均设作无限,每个点只会被打一次。此外,若不可无限生成,其只会经过“全部连向外界点”的转移,对此建图逆拓扑序 DP 维护 \(f(i,j)\) 表示一个 \(i\) 能生成几个 \(j\),同时动态维护 \(h(x)\) 表示不考虑无限前提下 \(x\) 的生成个数,在一个 SCC 确定后用其 \(f\) 更新所有点的 \(g\) 即可。
P13804 [SWERC 2023] In-order
在先序后序均给定的情况下,容易生成一棵形态一定的二叉树,只有单儿子点其儿子位于父亲左右不确定。容易先找出这些点。那么方案数只在于这些单儿子点。
容易发现,区间内必然存在唯一一个深度最浅的点,其余区间内点必然位于其子树之内。你从这个点往下搜,对于子树中一个单儿子点,只要其点子树中存在区间内的点,这条边方向必然一定,否则方向任意。
对于子树外部分,你只在乎该点到根路径上的单儿子,剩下的没有影响可以任意确定。你发现他们每个只会造成 \(1\) 的影响,也就是父亲这一单点是否放在子树左侧,所以任意在其中选取所需个数个点放左侧即可。
考虑所需点数。记区间内深度最浅的点为 \(x\),你首先得到其祖先中有两个儿子且 \(x\) 位于其右子树的点,它及其左子树必然位于给定区间之前。然后只需考虑 \(x\) 的左子树大小即可,若 \(x\) 有两个儿子则一定,否则若区间长为 \(1\) 它的儿子可以任意放之左右两种情况求和,再否则容易判定其儿子位于其左亦或其右。
QOJ5095 九王唱
倒着做。最后一个人只能把自己更讨厌的那一首删掉。对于倒数第二个人,若后一个人与自己最讨厌的是同一首,就把自己次讨厌的删掉,否则把自己最讨厌的删掉不劣。
依次前推,你发现每个人删掉的元素就是后面的人没选的元素中自己最讨厌的那个。
考虑对所有 \(p\) 求答案。你发现 \(p\) 右移一位,移动点以外的点其选中指针不降,移动点本身指针归零,直接做即可,\(O(n^2)\)。
QOJ3996 Race
注意到特判 \(S=T\) 之后,只要经过所有种类边奇偶性相同即可。首先所在块必须有所有颜色的边。
容易想到赋边权后异或,经典地跑一个 dfs 生成树出来,树边边权即由其种类得到,非树边额外异或上经过的树边异或和,最后把 \(S,T\) 到根的异或和或者其再异或上全集的值丢进线性基即可。
QOJ4001 Barbecue
考虑描述必败局面。先判掉一开始就是个回文串的情况,跑个马拉车即可。否则,你考虑必败当且仅当拿走左端点和拿走右端点均会形成回文串,发现形如 abababab,发现其必然是偶数,发现先后手串长奇偶性一定,所以判掉开局回文后胜负仅由串长奇偶性决定。
07.22
P10806 [CEOI 2024] 洒水器
考虑二分答案。容易考虑到贪心地左边没有就右转,否则左转,但发现这是错的。考虑到可能有一个点右转接一个点左转的情况。
你发现只考虑这三种单位元就可以表示所有合法方案了,设计 \(f(i)\) 表示考虑到第 \(i\) 个洒水器最远能贡献到哪一朵花,要求其前缀必须全都被贡献,转移从上一状态暴力拓展即可,一次 DP 是 \(O(n)\) 的。
P9139 [THUPC 2023 初赛] 喵了个喵 II
考虑如果每个值只有两个元素的话,存在合法划分的充要条件是,将每个值视作其两元素间的一条线段,则线段无交。
回到原问题,每个值有四个元素,巧妙地,考虑将之拆成两个值,规约回上述问题。拆法形如 aabb 和 abab。显然原问题有解充要于存在一组拆法有解。
每个元素有两种拆法,考虑 2-sat,冲突为包含关系,主席树优化建图即可。
QOJ18036 Algorithm Was Applied
考虑令一个点的贡献为 \(n-cnt\) 其中 \(cnt\) 为与其最终相连并在其之后的点数,最终求乘积即可。
考虑如何求 \(cnt\),你发现 \(i\) 最终能走到的点,形如它本来能走到的点,与连向它的在它之前的点能走到的点,的并集。你考虑拿一个 set 直接维护,顺序枚举 \(i\) 并使用并查集把 \(i\) 和连向它的合并起来,可达点集启发式合并即可。
set 总点数是 \(O(m)\) 的,故而复杂度两个 \(\log\)。
07.23
[NOIP2026 模拟 R4] 串串游戏 / QOJ4666 Delete And Win
考虑在 T 上枚举首个比 \(S\) 大的位置 \(i\),在 \(S\) 中匹配 \(T[:i-1]\) 并最小化结束位置 \(x\),找到 \(x\) 后最近的比 \(T_i\) 小的 \(S_j\) 或者 \(j=|S|+1\),那么除了匹配上的位置和 \(S[j:]\) 其余点都必须删,取最小值即可。
[NOIP2026 模拟 R4] 最长上升子序列 / QOJ4629 Longest Increasing Subsequence
相当于是每两个间隔之间都按线段树类方式分层,你可以从第一个点走到最后一个点,要求点的层数不降,求最多能经过的点数。层数只有 \(\log V\),直接定义 \(f(i,j)\) 表示走到点 \(i\) 位于第 \(j\) 层的方案。
考虑一个间隔内建的树,你发现除了最后一层都是满的,直接从对应层开始走即可。每层所有节点大小只会是一个 \(x\) 和 \(x+1\),容易 \(O(\log V)\) 维护每层点数。考虑最后一层,可能从倒数第二层走过来,但实际上倒数第二层按 \(x\) 和是否有 \(x-1\) 只有四种情况,四种都有简单的策略,直接分讨即可。复杂度一个 \(\log\)。
[NOIP2026 模拟 R4] 墙 / QOJ8712 Flooding Wall
定义 \(pre,suf\) 为前后缀最大值,所求即为:
考虑对单点求贡献,最大值的最小值不好处理,你考虑写作 \(pre_i+suf_i-\max\{pre_i,suf_i\}\)。\(h_i\) 项的贡献是好求的,考虑求剩下三项。
先考虑全局 \(\max\),我们枚举 \(\max=x\) 求局面数,直接做是 \(O(n^2)\) 的,你发现你只在乎由 \(a,b\) 与 \(x\) 的关系划分出的 \(6\) 种点有多少个,降序枚举 \(x\) 的话,每个点与 \(x\) 的关系只会变化 \(O(1)\) 次,动态维护即可。
再考虑前后缀 \(\max\) 求和,分开处理,二者本质相同。同样地考虑枚举 \(\max=x\),不妨记与 \(x\) 的关系为小于大于等于的分别为 sbe 类点,那么合法前缀需要满足其中有 e 类点且没有 b 类点。
每次枚举前缀复杂度爆了,你发现 e 类点总数只有 \(n\) 个,考虑对局面求合法前缀数,枚举第一个 e 类点位置 \(i\),再枚举第一个 b 类点位置 \(j\),那么序列分为三段,那么 \(<i\) 的只能取 s,\((i,j)\) 内的只能取 s 或 e,\(>j\) 的可以任意取,贡献易求。你发现容易把 \(j\) 的贡献挂到线段树上然后直接区间求和即可,顺序枚举 e 类点容易处理 \(<i\) 的点只能取 s 的限制。
[NOIP2026 模拟 R4] 有理数 / QOJ1883 Rational Dimasik
不妨先最简化给定分数为 \(\frac{b}{a},\frac{d}{c}\dots\),所求即为 \(\prod\frac{ac}{\gcd(ac,ad-bc)}\),只需考虑如何求分母。
考虑独立处理各质因数 \(p\)。不妨设 \(a=a'p^{k_1},c=c'p^{k_2}\),\(p\not\mid a',c'\),若 \(k_1<k_2\) 则 \(\gcd(ac,ad-bc)=p^{k_1}\gcd(a'c'p^{k_2},a'd-bc'p^{k_2-k_1})\),由于 \(p\not\mid a'd\land p\mid bc'p^{k_2-k_1}\implies a'd\not\equiv bc'p^{k_2-k_1}\pmod p\),故而 \(\gcd\) 中必然不含 \(p\) 因子。我们于是解决了 \(k_1\ne k_2\) 的情况。
考虑 \(k\) 相同时,提出 \(p^k\),原式变为 \(\gcd(a'c'p^k,a'd-bc')\),那么你就是要找到最大的 \(k'\le k\) 使得 \(a'd\equiv bc'\pmod{p^{k'}}\)。可以差分拆 \(\max\),即求 \(\sum_{k'=1}^k\left[\frac{b}{a'}\equiv \frac{d}{c'}\pmod {p^{k'}}\right]\),开个桶即可。
07.24
#7623. 彩带染色
你发现刷子的位置是重要的,同时相对顺序一定具体颜色是可以忽略的,且一组位置唯一确定一列的颜色段情况,故而考虑用刷子位置映射列状态,压位维护每一行是否有刷子。
考虑转移,我们先选出一个子集的刷子右移一步,超集和容易高维前缀和处理。你发现所有集合的转移总量是足够少的,故可以先不考虑限制把所有转移找出来,同时记录其颜色段,然后每次直接枚举所有转移判定即可。注意处理对第一列的限制。
P10683 [COTS 2024] 划分 Particija
先考虑原问题。
你考虑对每个点,两个划分中都有唯一一个包含它的,那么必须从二者中选出一个。可以建出二分图,对每个连通块取左右部点较小值即可。
考虑最小化答案。
我们发现我们需要分裂原连通块,而只要改的那一条边不是连接的两个孤点,存在方案将之连向一侧的连通块内部消除其影响,否则存在方案将其中一点加入某连通块较大一侧亦无影响,除非 \(n=1\) 特判即可。故只需找出所有割边,取其中对答案变化最大值即可。
考虑最大化答案。
我们发现我们需要合并原连通块,考虑如何选定最优连边对象,对一个左部点更少的块,我们会选定一个左部点更多的块与其相连,直接用左减右最大的块与其进行判定即可,反之同理。倘若选定的边是割边,先求出断边影响然后分别尝试为分出的两个块连边即可。
P10656 [ROI 2017] 学习轨迹 (Day 2)
倘若 \(a\) 序列选段一定,那么相当于给 \(b\) 序列划分出了若干子段,求其中最大价值的连续段。
倘若固定 \(a\) 选段左端点,动态右移右端点,那么相当于每次给 \(b\) 中一个段拆成两个,可以直接拿 set 维护。如果倒着做可以直接拿链表做到 \(O(n^2)\)。
硬做没有前途了,考虑发掘性质。你发现,若最终方案中两个序列都有选,则至少其一满足其元素和超过所在序列的一半,否则全选更大的序列不劣。
不妨钦定 \(b\) 序列选段超过一半,另一种可能本质相同,则首个前缀和超过一半的位置 \(p\) 在所有可能方案中必选,则只需维护在 \(p\) 左右最远能选到哪里即可。
在 \(a\) 序列上对选段右端点扫描线,维护每个左端点的答案,修改只需维护一个后缀 \(\min\) 和一个后缀 \(\max\),修改线段树二分覆盖即可,就做完了。
07.25
P17140 [NOI 2026] 线段
形成一棵树实际上就是要求没有点被覆盖至少三次并且选出的线段是连续一段。
将线段按左端点排序,然后维护 \(f(i,j)\) 表示选的右端点最长的是线段 \(i\),另一组右端点为 \(j\) 方案数,前缀和优化一下可以做到 \(O(n(n+m)K)\)。你发现,只要保证之前的选法合法,你不可能自己转移到自己算重,故而可以直接 \(f(i,j)\) 表示两组选段右端点分别为 \(i,j\) 即可,初始时枚举两条线段进行初始化,复杂度 \(O(Tn^2+nmK)\)。
P17141 [NOI 2026] 传送
对于任意局面,无论从任何节点使用传送门,其后的期望步数是一定的。因此局面固定时,一个点的答案就是直接走到 \(y\),或者走到最近的传送位置传送,二者较小值。那你发现,钦定完要走到 \(y\) 的点后,把剩下的点全都设作传送点是不劣的。
钦定走到 \(y\) 的点必然是一个连续段,我们记段内点数为 \(c\)、到 \(y\) 距离和为 \(s\),则走随机的期望步数 \(E\) 满足:
你注意到任意调整单点使其到根期望步数减小,\(E\) 不增,故而调整完的局面必然形如,与 \(y\) 距离不超过 \(lim=\lfloor E\rfloor\) 的直接走 \(y\),剩下的走随机。我们发现 \(E\) 关于 \(lim\) 是单谷,故而可以对每个 \(y\) 二分找到最终的 \(lim\),复杂度 \(O(n^2+m)\)。
瓶颈在于对每个 \(y\) 找 \(c,s\) 序列,树上邻域问题考虑点分树,复杂度 \(O(n\log^2n+m)\)。大常数选手原地爆炸。
你发现不用对每个 \(y\) 都二分,当 \(y\) 从一个点 \(a\) 移动到其相邻点 \(b\) 时,\(E\) 变化不超过 \(1\),从而 \(lim\) 变化也不超过 \(1\),故而我们对根节点二分之后对其余点只需进行 \(O(n)\) 次查询,复杂度 \(O(n\log n+m)\)。
P9329 [JOIST 2023] 两种货币 / Two Currencies
考虑找出路径上的所有站,那么必然贪心从小到大买。有一个简单的树上莫队套线段树。事实上可以在树上跑主席树,将两个端头的版本和 LCA 的版本合并起来即可得到路径信息,做到一个 \(\log\)。
07.27
[NOIP2026 模拟 R5] 图论之王 / #4225. Contact Tracing
注意到每个点得到信息的时间,要么是最后一次沟通前一天,要么是最后一次沟通,要么得不到。直接做即可。
[NOIP2026 模拟 R5] 王的盘缠 / #103. Money
每一段必须满足,内部元素不降,同时值域上不跨越之前已有的元素。任意前缀值域集合一定,同时跨不过去的间隙对于任意段来说都是跨不过去的,所以可以直接贪心,每次找到最远的位置开一段即可。
[NOIP2026 模拟 R5] 王的试炼 / P15721 [JAG 2023 Summer Camp #3] Many-hued Tree
考虑判定,你发现操作形态必然形如值域上从两边到中间逐步操作直到相遇。但你发现一个局面的可行操作方案不是唯一的,直接做可能会算重。
你考虑钦定从 \(1\) 一头能拓展就拓展,直到拓展不了然后再从右侧拓展过来。充分性显然,考虑必要性,若此时不合法,要么右侧拓展不过来,否则左右两段没有连边,右侧也无法再往左侧拓展,故而必然不合法。
考虑枚举最后一步合并时的那一条边,分别做其分出的两个连通块。考虑一个连通块,假如起点一定令作根,就是要求从根到叶子的所有路径不降,可以直接树形 DP 每次合并子树序列做。结果与合并顺序无关,故而是可撤销的,于是可以换根 DP 得到所有点为根的答案。
考虑如何不算重,不符合钦定条件仅当钦定的断边连接的两个端点都是各自序列上的最后一个,你发现可以直接在 DP 上开一维 \(0/1\) 表示钦定点是否在最后,转移是容易的。
[NOIP2026 模拟 R5] 王的加冕 / P16702 [MCO 2026] 雨水收集
和 R4 的墙是一个东西,不用神秘东西维护前缀后缀 \(\max\) 之和了,直接上一个单侧递归线段树就做完了。
P9331 [JOIST 2023] 护照 / Passport
任意时刻可达的都是一个连续区间,你发现路程必然形如一起走一段后分开各自走向 \(1\) 和 \(n\),线段树优化建图然后对每个点分别求出其到 \(1\) 和 \(n\) 的贡献和,最后跑一遍多源最短路即可。

浙公网安备 33010602011771号