【题解】P5068 数据结构 势能分析 目标寻找
第二次场切 Ynoi,虽然是简单题但还是留念。
考虑我们求的答案,让值为 的次数为 ,那么我们要对于 求区间和。
考虑怎么查询单个 ,即查询最小的 使得 中没有值,注意到对于 可能存在的这样的 只有调和级数 的,然后查询这些段里有没有值,这样就可以求出了所有的 ,进行区间加。
静态问题至此已经解决。
考虑动态问题,加入一个新值的时候,我们要将包含它的所有线段删除,然后对 进行修改并维护区间和,拿指针维护 ,移动总量是 的,现在问题就是如何找到这些线段。
一个简单的办法是离线,对每个位置记录下覆盖的时间,然后查询区间内最小值就是第一个出现的时间。但是我并没有想到,难过。
考虑拿数据结构找到所有这样的线段,拿树套树做二维偏序的话单次是两只 的,总复杂度会有三只 ,不太行。
重新考虑线段和点的关系,把所有线段挂在 上,然后对于所有 相同的线段,被删除的 是一个后缀,维护 个指针,删除后暴力后移,现在对于每个位置需要改变 的一个区间中所有 的值,所以考虑拿一个 SegmentTree-Beats 进行维护,在线段树上记录删除区间里面可以删除至少一条线段的最小的 ,然后每次直接在线段树上找可能改变的段,如果目前 不能改变最小的 ,就退出,这样每次改变的复杂度是均摊 ,复杂度就是 的,可以在线。
本文已经结束了。本文作者:ღꦿ࿐(DeepSea),转载请注明原文链接:https://www.cnblogs.com/Dreamerkk/p/17970908,谢谢你的阅读或转载!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步