P1903 [国家集训队] 数颜色 / 维护队列 题解

原题链接:P1903

题意

对于一个序列,维护两个操作:

  • \(a_{x}\) 改为 \(p\)

  • \(l\)\(r\) 中有多少个不同的数

思路

这道题本来是带修莫队的板子的,但是我是使用分块做的。

具体思路挺板的...但是这道题其实有个 \(trick\)。就是我们先预处理记录 \(pre_{i}\) 表示上一个 \(a_{i}\) 出现的位置。假设查询的区间为 \(l\)\(r\),如果 \(pre_{now} < l\),那么就说明当前这个颜色在这个区间内还没有出现过,于是 \(ans++\)。修改的时候需要更新 \(now\) 位置以及前后最近的两个的和 \(now\) 相同颜色的位置的 \(pre\) 的值。然后就可以分块做了。

首先,对于修改操作,我们假设需要修改的区间为 \(l\)\(r\)。我们可以将操作分为三个部分。

  • \(l\)\(l\) 所在块的结尾。我们可以直接暴力地去修改这个区间的每一个数,因为这一段区间的长度最长为 \(s\),修改的时间复杂度为 \(O(s)\)

  • \(l\) 所在块的后一块到 \(r\) 所在块的前一块。对于每一块,我们都可以直接修改一整个块的信息(\(p\) 数组),不需要对每一个数进行修改。而一共最多有 \(n/s\) 个块,时间复杂度 \(O(n/s)\)

  • \(r\) 所在块的起点 到 \(r\) 。同理,这一段区间的长度最长也为 \(s\),修改的时间复杂度为 \(O(s)\)

接下来是查询操作,我们还是假设需要查询的区间为 \(l\)\(r\)。我们也可以将查询操作分为三个部分。

  • \(l\)\(l\) 所在块的结尾。我们可以直接暴力地去计算这个区间的每一个数,因为这一段区间的长度最长为 \(s\),修改的时间复杂度为 \(O(s)\)

  • \(l\) 所在块的后一块到 \(r\) 所在块的前一块。我们会维护一个 \(p\) 数组来记录每一个区间内的信息(修改时也会更新 \(p\) 数组), 这样就不需要对每一个数进行计算 ,只需要把每一块的信息加起来即可 。而一共最多有 \(n/s\) 个块,时间复杂度 \(O(n/s)\)

  • \(r\) 所在块的起点 到 \(r\) 。同理,这一段区间的长度最长也为 \(s\),查询的时间复杂度为 \(O(s)\)

于是这道题就做完了。

posted @ 2023-12-19 11:47  Creeper_l  阅读(25)  评论(0编辑  收藏  举报
  1. 1 イエスタデイ(翻自 Official髭男dism) 茶泡饭,春茶,kobasolo
  2. 2 世间美好与你环环相扣 柏松
  3. 3 True love tired
  4. 4 一笑江湖 (DJ弹鼓版) 闻人听書_
  5. 5 最好的安排 曲婉婷
  6. 6 星星在唱歌 司南
  7. 7 山川 李荣浩
  8. 8 On My Way Alan Walker
  9. 9 百战成诗 王者荣耀·100英雄官方群像献礼歌
  10. 10 雪 Distance Capper / 罗言
  11. 11 Edamame bbno$ / Rich Brian
  12. 12 半生雪 七叔-叶泽浩
  13. 13 Catch My Breath Kelly Clarkson
  14. 14 Love Is Gone SLANDER / Dylan Matthew
  15. 15 Endless Summer Alan Walker / Zak Abel
  16. 16 悬溺 葛东琪
  17. 17 风吹丹顶鹤 葛东琪
  18. 18 Normal No More TYSM
  19. 19 哪里都是你 队长
  20. 20 Stronger Kelly Clarkson
  21. 21 廖俊涛
  22. 22 消愁 毛不易
  23. 23 The Runner Yubik
  24. 24 踏山河 七叔-叶泽浩
  25. 25 Waiting For Love Avicii
  26. 26 在你的身边 盛哲
  27. 27 Dream It Possible Delacey
  28. 28 凄美地 郭顶
  29. 29 满天星辰不及你 ycc
  30. 30 侧脸 于果
  31. 31 阿拉斯加海湾 蓝心羽
  32. 32 虞兮叹 闻人听書_
  33. 33 离别开出花 就是南方凯
  34. 34 盗墓笔记·十年人间 李常超 (Lao乾妈)
消愁 - 毛不易
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.