【题解】P4117 [Ynoi2018] 五彩斑斓的世界

题意

P4117 [Ynoi2018] 五彩斑斓的世界

给定一个长度为 n 的序列和 m 个操作,每次操作可以:

  1. 将区间 [l,r] 中所有大于 x 的值减去 x

  2. 询问区间 [l,r] 中值 x 的出现次数

1n106,1m5×105,1lrn,0ai,x105+1

思路

前置知识

第二分块。

分块 + 逐块处理 + 并查集。

[l,r] 中最大值为 k。第一种操作可以转化为两种形式:

  1. 2×xk,将值域在 [0,x] 中的值全部加上 x,之后给区间整体打上减法标记

  2. 2×x>k,将值域在 [x+1,k] 中的值全部减去 x

这里可以考虑用并查集维护。我们对于每一个值 x 都维护一个下标的并查集,则我们需要维护:

  1. i 对应并查集的根 rti

  2. 并查集的根 i 对应的值 vali

  3. 并查集的大小

则修改时整块直接合并两个值对应的并查集,散块直接暴力修改并重构。询问时整块直接统计并查集大小,散块则暴力统计。

当块长取 n 时,该做法的空间复杂度为 O(nn),会 MLE

考虑逐块处理,统计每个块对 m 个询问的贡献。

对于整块 x,修改时:

  1. 若整块 x[l,r] 完全覆盖,直接合并值对应的并查集

  2. 若整块 x 未被 [l,r] 完全覆盖,暴力修改并重构该整块

查询时:

  1. 若整块 x[l,r] 完全覆盖,直接统计并查集大小

  2. 若整块 x 未被 [l,r] 完全覆盖,暴力统计

这样只用开单块需要的空间,空间复杂度为 O(n)

显然整块经过若干次减法修改后值域不断缩小,当值域大小为 v 时,枚举的值域是 O(v) 的。

由于我们只关心并查集根的 size,所以可以进行路径压缩。路径压缩后并查集合并复杂度为 O(1),查询复杂度为 O(logn)

所以时间复杂度为 O(nm+vnlogn)

代码需要略微优化。快读快写套 inline,当前整块与询问区间无交集时不查询,值域上限减去标记后小于 x 不查询。

代码

posted @   kymru  阅读(106)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示
主题色彩