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

查询的时候分类讨论一下即可。

不影响连通性的合并这样的套路之前也见过,场上应该能看出来的,思路并不难。

posted @ 2022-07-25 21:36  Displace  阅读(40)  评论(0)    收藏  举报