NOI真题记录
1|0NOI真题
记录一些做过的 NOI 真题。
1|1NOI2013 向量内积
题意:有
思路:先random_shuffle一下,然后一次判断和前面的和的乘积,如果发现出现了不满足全部模起来都不为0就说明出现了答案,与前面的每一个判断一下就可以了。
1|2NOI2017 游戏
题意:有
思路:这一题乍一看是一个3-sat,而3-sat没有多项式解法,于是想办法转化成2-sat。
如果先不考虑
如果考虑
复杂度
1|3NOI2014 购票
题意:一棵树,有边权,两点的路径长度为边权之和,点
思路:其实还好,就是相当于维护一个区间李超树,可以根据出栈序,建立线段树套李超树就可以了。
1|4P6775 [NOI2020] 制作菜品
题意:有
思路:考虑为什么有部分分
如果
再考虑
于是直接用bitset优化背包就行了。
1|5P9479 [NOI2023] 桂花树
思路:发现题目的条件等价与
1|6P4027 [NOI2007] 货币兑换
题意:比较简单的李超树优化DP题。
设
变形后就是
于是可以直接李超树。
1|7P5472 [NOI2019] 斗主地
思路:猜到答案是一次函数或者二次函数,于是求出函数表达式后
1|8P7737 [NOI2021] 庆典
题意:给定一张有向图,满足特殊性质:对于三座城市
思路:好题。
首先,考虑原题给的条件有什么用。我们缩点后,发现每个点只保留最后一条与之相连的入边是不影响可达性的,因此再进行拓扑排序后就会形成一颗叶向树。
对于询问,可以分类讨论也可以建虚树。我们把
1|9P7739 [NOI2021] 密码箱
思路:算是神秘平衡树维护矩阵题。
首先,因为有
我们用向量
接下来考虑操作。
对于
对于
然后就可以用 fhq 维护了。需要维护 6 个信息,区间乘积,取反后乘积,翻转后乘积,取反并翻转后乘积。
1|10P7740 [NOI2021] 机器人游戏
思路:NOI 的神仙题。
大概理清了思路。
首先,样例解释告诉我们,可以用容斥来计算答案。于是我们枚举那些位置有起点,然后对于每个起点,我们可以求出这个点为起点对其他位置的限制,每个位置最终的限制是 0/1 ,
-
如果机器人爆炸了,那么可以当做贡献是 1。
-
如果同时拥有前两个或后两个,那么说明只能为空格,贡献是 1。
-
如果只有一种,那么每种输入都有唯一对应的输出,贡献为 3。
-
如果前两个里面有一个,后两个里面有一个,那么只能填 0/1 ,贡献为 2。
于是我们就可以做到
考虑怎么优化。我们发现 32 这个数字很可以折半,那么就往这方面入手。我们发现,如果最后的起点在位置
-
,那么直接枚举就是 -
,那么 只会影响 这些位置,这些位置之外的位置只有起点个数是否大于 0 有影响。即对于每个位置,只有前 个位置和在这之前是否有起点会造成影响。
于是就可以 DP 了。设
发现这样还是不可过,但是我们发现每一种限制都可以用 0/1 表示,很自然地就可以想到用 bitset 优化,即维护 4 个 bitset 分别表示 4 种限制是否存在,这样复杂度就是
1|11P8499 [NOI2022] 挑战 NPC Ⅱ
题意:有两棵树,要求是否可以把第一棵树删掉一些节点后和第二棵树同构。
思路:想的差不多是对的。
做法十分暴力:我们先求出每个子树的哈希值,然后对于两棵树,设
一些小剪枝:第一棵树中的节点子树个数不能小于第二棵树,以及如果子树大小相等那么可以直接判哈希值来看是否合法,不用再递归下去。
1|12P8500 [NOI2022] 冒泡排序
题意:求出一个序列,有
思路:神仙题。
先从subtask入手。
对于subtask1,只有0/1,那么先把全1的段填好,考虑剩下的位置。对于每个0的限制,我们把必须要填的0越往前填越好,所以可以把这些0填上,剩下的位置就是可以随意填的了。同时有一个性质,对于任意填的部分,他们之间是不会产生逆序对的,因此一定是一段前缀填0,后缀填1,直接枚举交界点就可以算贡献。
对于subtask2,也可以通过之前的结论得出,每个可以随意填的位置的贡献就是当前最优解,而全局最优解就是由这些当前最优解得出,于是可以简单地每个位置都取局部最优解。
对于subtask3,和subtask2唯一的区别就是一些点有下界的限制,这时只需把局部最优解变成找线段树上
正解:其实就是把subtask3拓展一下,对于相交的区间,如果
1|13P9480 [NOI2023] 深搜
题意:终于来写深搜了。
超级神仙题。
首先,合法的条件等价于所有非树边都是返祖边。于是就有了 36 分做法,即枚举关键点的选取情况
我们建出
于是对于一条非树边,它合法有两种情况:
1.落在虚树上的向虚树外延伸的某条边的对应子树内的返祖边(以该点为根)。
2.被虚树的某条边完全包含。
性质 B
先从性质 B 入手。
这时因为没有横叉边,我们可以把这里的虚树当成正常的虚树,对答案没有影响。考虑在虚树的根
接着就是子树内的贡献。设
接着是非树边的贡献。分 3 种:
- 对于每个
包含在 到 的路径上的非树边。 - 对于每个在
到 的路径(不含端点)上的点,它向虚树外延伸的某条边对应子树内的返祖边。 向虚树外的返祖边。
对于第三类非树边,我们可以摊到每个没有被选的孩子处计算。
- 对于选了点的孩子
,设 表示对于 前两类非树边的数量,贡献是 。 - 对于未选点的孩子
,设 表示 子树中返祖边的数量 加上一段为 ,一段在 子树内的非树边的数量,贡献系数是 。
那么就可以计算
不是关键点,那么要至少两棵子树被选,即为 。 是关键点,贡献是 (因为容斥)。
因为
接下来就是怎么通过
, 为 往 方向的儿子。 。- 第一类非树边,考虑每条边
,对于 有 乘以 2。 - 第二类非树边,对于
满足 在 的子树里,设 对应的 的孩子是 ,那么所有 的所有不是 的子树里 乘以 2。
实现上,先继承
对于
正解
考虑会多出什么情况。如果虚树的根
于是有一个
我们可以先对于每个孩子
我们发现,一条上述边的贡献相当于是把一个矩形乘上 2,然后求全局和,这一步可以考虑扫描线。最终要减去之前算的
复杂度
1|14P9483 [NOI2023] 合并书本
题意:给定长度为
思路:NOI 的神仙题。
考场上只写 10 分的暴力,甚至连状压和区间 DP 的都没写出来。
对于一棵树,它的磨损值之和为所有非叶节点的磨损值减去根节点的磨损值,但是我们不能直接得到每个非叶节点对重量的贡献,于是就考虑把贡献 下放 到叶节点进行统计。每个叶子的 重量贡献系数 就是它与其他子树合并的次数,而如果求出了每个叶子的重量贡献系数,那么统计答案可以排序后贪心选取,于是问题就是然后求出重量贡献系数。
因为是树形结构,于是我们可以考虑自底向上和自顶向下两种方法。
前者好像最多可以做到
自顶向下就是从根节点开始,每次分裂叶子得到新的叶子。我们记当前重量贡献系数的集合为
再考虑
就这样可以做到
我们发现,根据之前的每一次分裂非叶节点层数都会加 1,这意味着前一轮分出的两个叶子至少有一个要在这一层分裂,因此
1|15P6776 [NOI2020] 超现实树
思路:终于来写超现实树了。
首先,发现只有 “链树” 有用。链树即每个点的左右儿子大小的 min 不超过 1 的树。
证明可以考虑把一棵不是链树的树的一些子树砍掉,这样可以生成更多的树。
其次可以发现如果不能产生无数链树,那么就可以证明是近乎完备的。
因此我们需要判断这些链树是否可以生成无数链树。
我们考虑怎么刻画一棵链树。对于链树的每个节点,有 4 种状态:
- 有左子树,挂了叶子
- 有右子树,挂了叶子
- 有左子树,无叶子
- 有右子树,无叶子
于是我们把四叉树建出来,然后把每棵链树的底端打上标记,最后如果可以不经过标记节点走出这棵树那么就不合法,否则就合法。
1|16P8501 [NOI2022] 二次整数规划问题
题意:求一个序列
- 每个位置有限制
,其中 。 - 有若干个限制,表示
。
同时给出长为
思路:绝世好题。
就从部分分开始吧。
k=3
发现一个性质,就是如果一个元素的取值不固定,那么一定取 2 最优。
证明比较简单,因为把一个元素变成 2 不会影响第二类限制是否满足,而且这样不会让
于是就可以在
k=4
考虑能否延用
这时有一个结论,对于任意的
证明和上一个证明类似。
于是这时就只需判断每个元素是取 2 还是取 3。这时它们之间对 G 的贡献是一定的,于是每个数取 2 和取 3 对答案的贡献是线性的,于是一定是全取 2 或者全取 3 更优。
不过在确定每个元素的取值范围是要注意必须取 1 和
特殊性质 A
因为选的数之间没有限制,因此需要考虑的取值范围只有
此时有结论,对于取值范围相同的元素,它们都取同一个数是最优的。于是只有
复杂度
特殊性质 B
这时可以考虑暴力枚举每个被限制的元素的取值,考虑在有限制的变量之间连边,那么对于每个连通块,
复杂度
∑q 较小
我们可以把对
特殊性质 C
通过上一个做法,我们不难想到可以求出所有可能作为最优解的二元组
对于 100% 的数据
从特殊性质 C 我们不难发现,我们只关心哪些二元组
我们先把答案写成只有
我们把二元组
这时已经确定了的有左下、左上、右下 3 个点,于是只要矩形最后不是全部落在第三象限,取这 3 个点都最优,于是只用考虑矩形全部在第三象限的情况。
因为是坐标乘积最小,不难想到凸包,那么我们就需要求出凸包上的所有点,于是可以用 [BalkanOI2011] timeismoney | 最小乘积生成树 的做法——分治求凸包上的点。具体地,假设当前要找到在
那么问题就是每个元素取 2 有
于是考虑建立最小割模型。我们把每个元素拆成 2 个点
1|17P2178 [NOI2015] 品酒大会
题意:对于每个长度,求有多少对后缀的 lcp 不少于这个长度和后缀权值乘积的最大值。
思路:从后缀的 lcp 入手不难想到后缀数组,而求出
考虑按
1|18P1973 [NOI2011] NOI 嘉年华
题意:给出一些区间,让你在这些区间中选出两组,两组区间不能有交。求:
① 让两份中分到区间数最小的一份,尽量得到更多的区间。
② 在第
思路:首先,区间可以离散化,于是预处理出来在
对于第一问,可以设
那么第一问的答案就是
然后考虑第二问。初步的想法就是钦定
这样一个区间的答案就是
现在问题是求
1|19P1963 [NOI2009] 变换序列
题意:给定
思路:可以把
在此题中,每个点左部点最多连两条边,所以直接倒着匹配就是字典序最小的方案。
1|20P1912 [NOI2009] 诗人小G
题意:把序列划分成若干段,每一段的代价是
思路:
这个
于是可以用二分栈的经典做法来实现,复杂度
1|21P2805 [NOI2009] 植物大战僵尸
题意:给定一个
思路:容易发现这就是最大权闭合子图的模型。最大权闭合子图是每个点有权值,如果要选择一个点就要选择这个点的所有出边,要求最大权值。
做法是对于每个点,如果权值非负,就由源点向这个点连边,否则就向汇点连边,边权就是点权的绝对值,然后对于原图中的边
为什么这样做是对的呢?首先,能被割掉的边一定是连向原点或者汇点的边,那么考虑与
回到这题,我们发现几乎是一样的,但是问题在于可能会出现环,于是可以建反图跑拓扑排序来去掉环的影响。
1|22P7735 [NOI2021] 轻重边
题意:给一棵树,每条边可能是轻边或者是重边,有两种操作,一是把与一条路径上的点相连的路径变为轻边,然后把路径上的边变成重边,二是查询一条路径上有多少条重边。
思路:直接做很难,考虑怎么转化成更好做的形式。我们考虑把第一种操作变成给点染色,每一次操作就染成新的颜色,那么一条边两端颜色相同就是重边,否则就是轻边。
这个就可以直接用树剖维护了,相当于是在线段树上维护相同颜色连续段数及长度。不过在查询时合并处细节较多。
复杂度
__EOF__

本文链接:https://www.cnblogs.com/Xttttr/p/18015109.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】