普通莫队
就是暴力
几个注意的地方:
排序关键字顺序:
b
l
o
[
l
]
>
r
blo[l]>r
blo[l]>r, 即按
b
l
o
[
l
]
blo[l]
blo[l]排序,
b
l
o
[
l
]
blo[l]
blo[l]相同按
r
r
r排序.
l
l
l和
r
r
r移动的操作要先动add, 否则会出现
c
n
t
cnt
cnt为负的情况.
如果要记录出现次数的次数(
C
N
T
CNT
CNT数组),
C
N
T
CNT
CNT数组尽量开大些, 有些时候会出现魔幻情况(某个
c
n
t
cnt
cnt比
n
n
n还大??).
题1:
小Z的袜子 除了算一下新来的一个的贡献. 就是莫队裸题.
题2:
CodeForces 220B Little Elephant and Array
询问区间内出现次数为数本身的数的个数
莫队做就是裸题…
一些同样很裸的题:
SPOJ DQUERY D-query
CodeForces 86D Powerful array
LightOJ 1188 Fast Queries
题3:
Frequent values
题意就是给出一个数组(非降序), 每次询问
l
l
l到
r
r
r之间的众数的出现次数.
这个题其实是RMQ或者线段树的入门题, 但是在这里我们发现可以用记录次数的次数(
C
N
T
CNT
CNT)的莫队做.
O
(
n
∗
n
)
O(n*\sqrt n )
O(n∗n)竟然跑的飞快…并且也没有用到非降序的性质…
题…:
良心峰巨在线出题(询问
l
l
l到
r
r
r内和为
0
0
0的最长区间长度)
CF 617E XOR and Favorite Number(询问
l
l
l到
r
r
r内异或和为
k
k
k的区间个数)
带修莫队
对于每个询问带上时间戳, 每个修改都是一个时间, 对于每个询问不光要移动
l
l
l和
r
r
r, 还要有toBefore和toFuture的操作.
注意带修莫队的右端点与左端点相同, 按照在哪一块中排序, 而不是按照值排序.
题1:
数颜色
询问
l
l
l到
r
r
r之间有多少个不同的数, 不时修改某个位置的数.
离线所有询问和修改, 询问保存
l
l
l,
r
r
r,
t
i
m
e
time
time(位于第几个修改后), 修改保存改之前是什么, 改之后是什么(因为不只有toFuture, 还有toPast). 修改不动, 询问排序.
题2:
UVA 12345 Dynamic len(set(a[L:R]))
每次询问L到R区间中不同数的个数, 存在单点修改.
带修莫队裸题, 只是题意比较坑, 数组下标从0开始, 区间是左闭右开.
题3:
CodeForces 940F Machine Learning
对于每次询问, 将每个数出现次数加入一个集合, 输出第一个不在集合中的正整数.
这个题一开始困扰了我很久, 怎么都觉得这个题直接套莫队是
n
2
n
n^2\sqrt{n}
n2n的复杂度. 毕竟如果维护区间中"每个出现次数的次数"(CNT), 检查答案还是要从1开始枚举…
最后hdg告诉我其实CNT最大也只有几百(因为是次数的次数, 最坏情况下, a出现1次, b出现2次, c出现3次…n总共1e5, 设CNT数组最大到x, 即1+2+3+…+x=1e5, 解得x不超过447), 直接去暴力扫就好了…复杂度 O ( 447 ∗ n n ) O(447*n\sqrt{n}) O(447∗nn)
(然后果断T了…0w0
…CF数据真的强, 不然我不会知道原来我一直在写假的带修莫队…)
重点:
在对询问排序时, 带修莫队与普通莫队不同, 注意带修莫队的右端点与左端点相同, 按照在哪一块中排序, 而不是按照值排序.