1 条题解
-
0
题解
思路
设查询区间长度为 。若区间内所有数互不相同,那么它们能重排成连续整数,当且仅当区间最大值减最小值等于 。因此关键是同时维护区间最大值、最小值和“是否出现重复”。
做法
小规模做法
每次查询复制区间并排序。排序后依次检查相邻元素之差是否都为一。修改直接写回原数组。该做法单次查询为 ,适用于 。
无修改做法
定义 为位置 左侧最近的、与 相等的位置;若不存在则为零。区间 内没有重复,当且仅当区间内所有 。
序列不修改时,可以预处理每个位置的 ,再分别建立区间最小值、最大值和 最大值的稀疏表。每次查询为 ,预处理为 。
小值域做法
当所有值不超过 时,在线段树的每个结点保存该区间出现值的 bitset,并记录合并过程中是否发现重复。左右儿子的 bitset 有交集就说明存在重复。查询得到 bitset、重复标记、最小值和最大值后即可判定。单次修改和查询均为 。
满分做法
动态维护每种数值出现位置的有序集合,同时维护每个位置的 。一次单点修改只会改变:被删除位置、旧值集合中它的后继、新值集合中它的后继,这些位置的 。
在线段树中维护区间最小值、最大值和 最大值。查询 时,若
max(pre) < l且max(a)-min(a)=r-l,答案为damushen,否则为yuanxing。每次集合前驱/后继查找、线段树修改和查询都是 ,总复杂度为 ,空间复杂度为 。
正确性说明
对任意位置 ,若 ,则 在区间中至少出现两次;反之,区间中若有重复值,取该值在区间内第二次出现的位置,其前驱一定仍在区间内。因此
max(pre)<l与区间元素互异等价。在元素互异的前提下,长度为 的整数集合至少覆盖 个不同整数。其最大值与最小值之差等于 时,闭区间内恰有 个整数,集合只能恰好包含它们全部;反之连续整数显然满足该式。两项条件合取即为题目要求。
复杂度
小规模做法单次查询为 ;无修改做法预处理 、单次查询 ;小值域做法单次操作为 ;满分做法总时间为 ,空间为 。
- 1
信息
- ID
- 932
- 时间
- 3000ms
- 内存
- 512MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者