【做题记录】Ynoi2018 天降之物
- 天降之物
题目:
一个长为 的序列 。
需要实现 个操作,操作有两种:
-
把序列中所有值为 的数的值变成 。
-
找出一个位置 满足 ,找出一个位置 满足 ,使得 最小,并输出 。
。
题解:
考虑根号分治。
对于阈值 block,设一个数出现次数为 ,那么对于 分为比 block 大、小的情况,称作大数、小数。
对于查询两个小数的情况可以直接线性归并得到结果,单次复杂度 。
大小超过 block 直接 扫描,因为大数最多 block 次。
考虑对于大数定义它的附属集合为其合并时用过的小数,保证长度 block,否则直接暴力更新。
考虑修改。
小数小数合并,小数就不管,大数暴力更新。
大数大数合并仍然是暴力更新,因为每个大数最多被合并一次,所以均摊下来仍然是 。
大数小数则直接把 并入 的附属集合。。
考虑查询。
小数小数则暴力合并。
大数大数考虑将 合并到 和将 合并到 的代价的 min。
大数小数暴力归并 的附属集合( 为小数),再与 并到 的情况取 。时间复杂度 。
总的时间复杂度 ,空间复杂度 。
至于 block 不一定是严格的 ,取到 650 最好。
目前最优解。
本文作者:trsins
本文链接:https://www.cnblogs.com/trsins/p/15815394.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步