2022.07.25 NOI模拟赛总结
1.时间安排
7:40~8:00
T1:给初始状态,经过点状态取反,求最短的路径使得所有点状态都为1,有n=100的DP分,还有链上以及初始全0的特殊分可以写。
T2:区间的价值为区间长度区间a的最小值区间b的最小值,求最大的区间价值,有20分 \(n^2\) 暴力,剩下的都是正解分。
T3:给出了一种构造树的方法,求两点lca,有30分暴力模拟和预处理,剩下的有离线和在线分。
8:00~8:30
以为T1应该很好讨论出 \(n^3\) 的换根这类的做法,但是情况太复杂了,主要卡在了存在一个子树可以不回头走完的情况,这个情况使得DP状态数直接变成阶乘级别。
想了半个多小时没什么思路,先跳了。
8:30~9:00
写了T2的暴力和T3的30分模拟和预处理,手构数据没问题。
9:00~10:00
试着推T1链上和全0的分数。
链上的话两端点特判,定了起点后可以向两个方向走,一个方向可以不回头,问题就是在于如何计算一直走下去的最小代价。
试着分成全0和全1分别讨论,虽然没推出来具体计算的式子,但是这样做01交替的数据就卡死了。
似乎可以借助上一步的DP值算当前的,但是还是讨论不出来计算的式子,太恶心了。
放弃,想全0。
一开始猜结论和每个点的度数有关,手画了一些图证明和度数一点关系都没有。
然后试着猜起点是重心这类的结论,链又不符合要求。
猜了若干结论都被推翻了,寄。
10:00~11:30
想了很久怎么转化T2,最终转化为了给出一个序列,支持单点修改成0,全局查询最大子段,子段的价值定义为子段长度*子段最小值。
一开始以为这个东西和最大子段和一样具有可合并性,写了个线段树,wa飞,仔细分析极大递增序列就能卡掉。
发现这个做法暴力的话和最长上升子序列长度似乎有关,这个东西期望是 \(\sqrt n\),不过后来发现并不是这样,仍然存在跨越修改点的变化区间。
想了很久很久怎么转化,没结果。
11:30~12:30
T3一点想法都没有,开摆。
result:
T1:/ T2:20 T3:30
(这都能rk2?J神220分薄纱全场)
2.总结
T1:
我这辈子都不想再碰分讨题了。
不知道给的特殊分怎么写,题解也没说。
正解是恶心的分类讨论,不过DP状态的设计还是很妙的。
首先选择一个0点作为根,可以证明以1点为根的树求出的答案一定劣。
因为路径只有两个端点,可以设计三种状态。
\(f_{x, i}\) x的子树没有路径端点,x的状态为i,子树全1的最短路径长度。
\(g_{x, i}\) x的子树有1个路径端点,x的状态为i,子树全1的最短路径长度。
\(h_{x, i}\) x的子树有2个路径端点,x的状态为i,子树全1的最短路径长度。
讨论很麻烦,不展开详细说了,lg题解很详细。
这种分讨题感觉场上几乎不可能写出来,细节太多了。
T2:
需要李超线段树,刚学会,订题可能要稍放放。
(待upd)
T3:
%J神\(n\sqrt n\)场切,虽然正解是\(nlogn\)
数据结构妙题。
J神的做法是考虑把n层的树分层 \(\sqrt n\) 个块,预处理出经过一个块后一个数变成了什么,不过据本人描述预处理很麻烦。
\(nlogn\) 做法是可持久化线段树。
可以把原树剖分为若干长链,满足链尾是特殊点或叶子。
容易证明只有 2n+1 条长链,把链缩成点不影响连通性,这样就可以预处理lca。
问题来到了怎么查询一个点在哪个长链中。
用可持久化线段树维护当前正在不断更新的长链,容易发现除了与上一层关键点直接相连的两个点,其他点都是可以往上延伸的,这两个点对应的两条链在这里就结束了,同时加入一条上一层关键点的新链。
只有 \(O(n)\) 次修改,时空复杂度都是 \(O(nlogn)\) 的。
查询的时候分类讨论一下即可。
不影响连通性的合并这样的套路之前也见过,场上应该能看出来的,思路并不难。

浙公网安备 33010602011771号