NOI2023
NOI2023 题解
应该是全网首发?
D1T1 方格染色
shaber 题。
首先假设只有横竖线,总答案等于横线的并 + 竖线的并 - 横竖的交。前面二者排序后容易计算,后面考虑按照 递增顺序依次加入竖线,同时扫描线维护横线,在加入新的竖线的时候减去此时在区间的横线个数,可以用线段树 / 树状数组维护。
有斜线时,还是对斜线求并,再减去公共部分,可以暴力枚举所有与其相交的横竖线,对本质不同的交点求和。
时间复杂度 。
D1T2 桂花树
抽象题意:对于一个 的 而言, 分别在 上的一级祖先,二级祖先等分别与 上只保留 的点构成的虚树上的父亲完全相同。也就是 和 的虚树相同。
一个 的点要么插入边中,要么挂在一个点上作为儿子。于是当 时答案为 1, 时答案为 ( 种方案挂在点下, 种方案插入边中), 时为 ,因为 时 和 可能以 “ 插入边, 作为 的儿子” 的形态存在,而此时的插入方式可以看做 “先预留一个编号在 ” 的点插入边中, 再作为其儿子“
进一步发现可以从小到大加入点,设 表示考虑到第 个点,目前预留点的状态为 的方案( 的第 位表示有一个 的限制),此时总点数为 ,转移:
- 挂在点或边上:。
- 预留一个点:。
- 解决一个点的预留:找到一位 为 1 设为 0 再左移转移即可。
发现答案和树的形态无关,时间复杂度 。
D1T3 深搜
以 为根 的生成树为 的充要条件为 中所有边在 中都是返祖边。即 dfs 树的定义。
首先容斥:钦定非空关键点集 ,求得在所有 为根下都是返祖边的额外边个数 ,贡献即 。暴力 计算 36pts。
再考虑链,判掉 或者 为关键点的情况。设 表示 为最后一个被选点的方案,转移:,其中 为包含于 的边的个数,从小到大转移,枚举 时若存在 边,则把 的 dp 值全部 ,最后查询全局和,可以用线段树维护,。
拓展到树上,考虑选定的关键点在树上的分布,对于一条额外边 ,则要求所有关键点全部在 的子树或者 的子树,不存在夹在内部的情况,于是可以想到建出关键点的虚树,所有边必定是夹在两个虚树上的点,或者在这些点的子树内。但有一种特殊情况:虚树的根是一个虚拟节点,且恰好有两个儿子,此时在两个儿子到根的路径上的边可以选择。没有这种情况时,恰好对应了特殊性质 A。
先预处理 分别表示 子树内 / 外的边的个数,答案统计在虚树的根上,贡献为 。
当 子树内有 个不同子树的点选择时, 会被自动选择,于是需要背包。如果 作为 的子树内点被选,还要乘上 上的边,边上的点在异于儿子子树的子树内边的个数。同样可以用以 dfs 序为下标的线段树维护:第一类边直接在 区间乘即可,第二类边在处理完 后枚举儿子 , 乘上其他子树的边的个数。如果 子树选点,贡献为子树和,否则为子树边条数。然后根据 是否为关键点讨论即可。
时间复杂度 。
最后处理存在横叉边,根恰好有两个儿子的情况,此时 会而外加上在 1 为根意义下为横叉边,但 意义下为返祖边条数,其他不变,同样预处理,为了区分选了 2 个或 个需要多背包一下。
枚举虚根 ,此时线段树内已经求得 到某个儿子的方案 。枚举两个异侧子树点 ,贡献为 乘上其它子树不选的方案。先求出 ,每个子树将 除以 ,这样只和两个子树有关。将横叉边挂在其 lca 处,对于一个横叉边 ,相当于把 的点权值 ,然后查询全局矩形和。可以扫描线,然后只用考虑一段极小区间 ,再开另一棵线段树维护第二维的区间乘,累加第一棵线段树上 之和乘上第二棵线段树全局和。然后再减去两个点在同一个子树的情况。
时间复杂度 。
D2T1 贸易
shaber 题。
先处理 互为祖先关系的,如果 是 祖先就将 子树中所有点和祖先加入跑 dijkstra,注意不要加入祖先的额外边,因为 到祖先的最短路可以直接求。
如果不互为祖先,枚举 ,必然是 不断跳到 然后只和 有关,随便算算就好。
时间复杂度 。
D2T2 字符串
题目要求非常奇怪,不妨先拓宽条件,变成 ,容易发现二者等价。
将所有前缀和后缀一起跑 SA 得到每个前后缀 rk,又可以转化为 ,这部分可以直接二维数点,但可能存在 为回文串,第一个不回文位置 满足 ,此时同样导出 ,需要减去。
用 manacher 求得每个偶回文串 ,的回文半径,设左右端点分别为 ,则会对一个询问 有贡献当且仅当 ,同样二维数点。
时间复杂度 。我才不会告诉你考场上写 SA 调了半个小时。
D2T3 合并书本
将合并过程看做二叉树,首先有显然 做法,当 可以用一个 dp 代替。
然后可以考虑乱搞,包括但不限于模拟退火退树的 prufer 序列,以及将原序列随机打乱做 的 dp,但是没有实质性进展。
不懂就问:
理性分析,推推性质,猜猜结论,得到了一个复杂度是拆分数乘以 的做法。
是 tm 什么人类。
考虑从根节点开始不断加叶子,看做每个点有一个覆盖次数 ,每次加两个叶子等价于加入 。 当树的形态固定时磨损时一定,于是需要记录的状态有最后一层的 的可重集 ,当前磨损值 。
每次选择一个 ,加入 ,同时 (建议多画几个图理解一下)。
然后考虑如下事实:
- 根据排序不等式,最后一定是大的权值和小的 配对,小的权值和大的 配对。
- 一定可以以 单调不降加入,反之可以将前面几次放到后面,且最后 。
- 每次令 的 一定是从小到大排序后的前缀(大了一定不优秀)。
根据如上策略,可以搜 的拆分作为每次 ,由于拆分 ,直接搜 65pts。
注意到相同的 只用保留最小的 ,相同的 只用保留最小的 ,设 表示目前扩展到 ,上一个大小为 的最小的 ,用 map 记录 dp 状态然后用上面的转移就行了。时间复杂度 。
本文作者:henrici3106
本文链接:https://www.cnblogs.com/henrici3106/p/17606780.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步