DS 小结
DS 小结
-
Luogu P5046 [Ynoi2019 模拟赛] Yuno loves sqrt technology I
对于全局询问容易使用归并排序求解答案,因此考虑分块将这个复杂度进行优化。
将区间的贡献拆为散块对散块,散块对整块,整块对整块,分别处理计算。精细实现做到
。注意常数优化。
-
考虑分治,并且将二维问题拍成一维问题加上时间轴。
为什么可以这么处理?因为我们有可以处理历史最值的数据结构。因此可以猫树分治套上一个区间历史最值线段树求解。
时间复杂度
。 -
对于全局可以使用分治
求解。因此使用分块进行优化。可以从左至右挨个计算每个块对答案的贡献,块和块之间独立。使用双指针可以做到
。超级卡常题。打死卡不过去了。
-
容易将函数表达成一个分段函数,即初始进这个区间的时候至少需要有
才能够在这个区间中被减去 次 。容易发现这个东西可以放到线段树上,可以做到一次询问拆成 个区间,然后每个区间用二分做到一次询问 的复杂度。那么考虑如何预处理这个
,显然可以 。这样做是 的。发现可以使用决策单调性,然后即可把预处理优化至 。总时间复杂度
。 -
将询问离线,按照
排序,从小到大加入矩形。对于每一个点可以处理出一个
表示最晚被覆盖的时间,显然询问就是查询一个后缀和。考虑这个
如何维护。容易发现,每次加入一个矩形就是对一个矩形内的关键点的区间覆盖,容易使用 KDT 做到单次修改 的复杂度。因为每次修改会影响后缀和,所以需要使用数据结构维护这个后缀和。由于总共有
次修改, 次查询,因此使用 的分块平衡复杂度。总时间复杂度
。 -
一个性质就是树上的一个连通块一定存在一个点,使得这个点在点分树上深度最小,且其他所有联通块中的点都在这个点的子树内。因此可以将所有询问扔给
的某个祖先进行处理。然后对于子树内的贡献,一个点有效当且仅当这个点到当前分支中心的路径上的所有点都满足值域限制。因此在子树内做 2-side 即可。
时间复杂度
。 -
首先所有连通块一定是一个连续的区间,这个容易证明。因此一个分割点
一定满足 。考虑枚举后半部分的值
,将大于 的部分设为 ,其余为 ,那么这个 有贡献的序列形如 。考虑相邻两个数 ,当 会产生贡献。因此可以使用线段树去维护 值。对于每一对相邻的 ,将 区间加 。最后答案的数量即为 的个数。将
,可以使得全局最小值为 ,因此只需要维护最小值个数即可。时间复杂度
。 -
离线询问,从右向左扫描线。设当前位置为
,开一个线段树维护 时间的后缀 和答案。容易发现,每次修改就是对这个线段树上的一个后缀取
。而对于答案的统计就是这个点被修改的次数。直接使用 Seg Beats 解决即可,时间复杂度
。 -
可能的询问伤害并不多,所以考虑对于每一种伤害都维护一个次数。容易发现,所有次数的和是一个调和级数,所以只需要支持每次修改时快速找到需要修改的伤害值即可。用线段树维护每个区间,然后单点查询覆盖的区间。
删除区间的时候需要使用懒惰删除,否则常数太大。
时间复杂度
。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
2022-08-18 C220818C 城市游历