【考后总结】NOI 春季测试 2023
文化课补完了,所以来改题。
T1 涂色 paint#
弱智签到题,维护时间戳。
提交记录:Submission - QOJ
T2 幂次 power#
一个数可能会被统计多次,例如 ,考虑只在 ,即指数最大的位置记录答案,由于 比较特殊先不考虑。
可以得到 ,表示可以表示为 的个数。
于是要在 处删去 次的贡献,也就是减去所有倍数的并,容斥:
显然多重集没有贡献,容斥系数是 ,集合交的大小也就是对应的 。
提交记录:Submission - QOJ
这个复杂度在 CodeForces 里过不去,原因是单次 不够快。
容易发现 时数据规模较小,可以暴力枚举底数和指数,并且这个支持预处理。
的部分可以用 求出,但有重复部分,重复部分可以在暴力枚举 时不统计指数为偶数的情况。
T3 圣诞树 tree#
任意选四个点构成一个四边形,走对角线一定不是最优策略,同样路径也不能出现交叉。
这说明对于已经走到的区间 下一个要去到的位置一定是 或 ,区间 DP 一下。
提交记录:Submission - QOJ
T4 密码锁 lock#
#
直接输出最大值减最小值。
#
容易发现把较小值放一行把较大值放一行一定不劣。
#
和 关系不大。
直接求不好求所以考虑二分答案,目前二分的极差为 。
所有数中的最大值和最小值放在一行一定最劣,所以我们相当于已经确定一行的最大值和一行的最小值了,那么对于每一列都可以 判断当前这个顺序是不是能满足条件,具体就是看与最大值一行的是不是不小于 ,与最小值一行的是不是不大于 。
而剩下一行实际上是一个值域的问题,假设当前枚举的列在剩下一行的值为 ,那么这个值适用于最小值在 内的情况,区间加,只需要判断是否存在一个位置被加了 次。还剩一个问题是一列可能不只有一种放置方法是满足条件的,但这几种放置方法对 的贡献不能同时存在,所以需要对每一列的贡献区间求并集再差分。
钦定最大值在第一行,最小值在第二行和第三行是不同的,需要枚举。
这样单次判断的复杂度是 ,总复杂度 。
#
做法放到 ,正解就呼之欲出了!
把一维的线段加改成矩形加,线段求并改成矩形求并,剩下就是一个扫描线。
需要思考的是如何把一列 个矩形求并,直接容斥的 不够优秀,可以考虑把矩形拆成多个。
一个拆法是把纵坐标离散化,把每个纵坐标区间的矩形单独拿出来,类似一个线段求并。但问题是我们把答案记在了矩形的每个整点上,这样会出现矩形边界被计算两侧或矩形实际上是线段而没有被计入。在此基础上修改,可以把每个矩形边界单独拿出来,剩下纵坐标区间改成开区间,但矩形个数增加,常数变大了。
一个好的解决方法如下:

对于一个 的矩形,由于横向是线段处理,不做改变,而纵向改成 ,这样相当于把整点 的答案记在了正下方的方格上,这时候再对矩形求并方格一定不会算重,同时也就规避掉了矩形本身是线段的情况。加入扫描线时再把 加回来即可。
这样单次判断的复杂度是 ,总复杂度是 ,可以通过。(算复杂度可能把部分展开的循环也计算在内了。)
提交记录:Submission - QOJ
作者:SoyTony
出处:https://www.cnblogs.com/SoyTony/p/Problems_in_NOI_Spring_Test_2023.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效