CF940F Machine Learning
莫队维护区间每个数字出现的次数,维护某个出现次数是否出现过,暴力枚举mex即可,易证每次枚举最多
n
\sqrt n
n次
CF375D Tree and Queries
树转链,莫队维护区间每个颜色出现的次数,如果再单纯维护次数为k的颜色有多少,最后枚举
1
−
k
1-k
1−k,超时,所以直接维护次数
>
=
k
>=k
>=k的颜色有多少
P4074 [WC2013] 糖果公园
树转链,莫队维护区间,按题意计算新加一个点的贡献。但是发现询问是一条路径,是多个不同的区间合起来的答案,所以树转链用欧拉序列,维护每个点遍历到和回溯到的时间戳,然后将两点的路径转换为区间问题,如果一个点在区间中出现两次,说明不在路径上,贡献抵消。然后特判一下
l
c
a
(
x
,
y
)
lca(x,y)
lca(x,y)是否与
x
,
y
x,y
x,y不重合,单独计算
l
c
a
(
x
,
y
)
lca(x,y)
lca(x,y)的贡献
CF1514D Cut and Stick
如果整个序列中没有数超过
⌈
n
2
⌉
\lceil {n \over 2} \rceil
⌈2n⌉的数,不用划分序列
如果有,当且仅有一个,只需要把这个数用其他数尽可能放到一个序列中,再将这个数剩下的单独成一个序列即可
得出组数为
2
×
m
a
x
n
−
(
r
−
l
+
1
)
2 \times maxn-(r-l+1)
2×maxn−(r−l+1)
所以只要维护区间中某个数出现的最大次数即可,莫队或者主席树维护
(主席树以区间下标为时间轴,每次只要线段树二分查询是否存在点
>
⌈
n
2
⌉
>\lceil {n \over 2} \rceil
>⌈2n⌉,易证查询时间复杂度O
(
l
o
g
n
)
(logn)
(logn))
P3203 [HNOI2010] 弹飞绵羊
CF13E Holes
分块,对于每个点,维护跳出当前块需要多少步,跳出后到达哪个点,这样修改只要
O
(
n
)
O(\sqrt n)
O(n) 块内倒序暴力重构,查询因为是一个块一个块地跳,所以也是
O
(
n
)
O(\sqrt n)
O(n)。要计算最后从哪个点跳出,需要保留一下跳块时的最后跳出点,再看是否能一个点一个点地继续往后跳
CF455D Serega and Fun
强制在线,首先考虑朴素做法,对于整体来说,单次修改时间复杂度为
O
(
n
)
O(n)
O(n),考虑分块,对于修改一个区间,如果包含了一些块,这个块只要弹出块尾,添加块首即可,用双端队列可以做到
O
(
1
)
O(1)
O(1)维护,对于两端只有不完整的块,
d
e
q
u
e
.
e
r
a
s
e
O
(
n
)
deque.erase O(\sqrt n)
deque.eraseO(n)解决
那么对于查询,只需要维护块内每个数出现了多少次
最后特判一下区间
[
l
,
r
]
[l,r]
[l,r]在同一个块的情况