随笔分类 -  基础算法 - 莫队算法

摘要:题目大意:给定一个长度为 N 的序列,M 个询问,每次询问区间逆序对的个数。 题解:用树状数组加速答案转移。 代码如下 cpp include define fi first define se second define pb push_back define mp make_pair defin 阅读全文
posted @ 2019-04-10 17:16 shellpicker 阅读(147) 评论(0) 推荐(0)
摘要:题目大意:给定一个长度为 N 的序列,有 M 组询问,每组询问查询区间 [l,r] 内异或和等于给定常数 K 的区间组数。 题解:对于异或和问题,一般先进行前缀和处理,转化为两个点的的关系。因此,经过前缀和处理后,询问变成了在给定区间内,查询二元组 $(i,j)$ 满足 $a[i]\oplus a[ 阅读全文
posted @ 2019-04-07 23:50 shellpicker 阅读(221) 评论(0) 推荐(0)
摘要:题目大意:给定一棵 N 个节点的无根树,每个节点有一个颜色。现有 M 个询问,每次询问一条树链上的不同颜色数。 题解:学会了树上莫队。 树上莫队是将节点按照欧拉序进行排序,将树上问题转化成序列上的问题进行求解的算法。需要分两种情况进行讨论,第一种情况是对于询问 x,y 来说,x 为 y 的祖先,则询 阅读全文
posted @ 2019-04-07 12:04 shellpicker 阅读(239) 评论(0) 推荐(0)
摘要:题目大意:给定一个长度为 N 的序列,每个点有一个颜色。现给出 M 个操作,支持单点修改颜色和询问区间颜色数两个操作。 题解:学会了序列带修改的莫队。 莫队本身是不支持修改的。带修该莫队的本质也是对询问进行分块,不过在莫队转移时需要多维护一个时间维度,即:每个操作的相对顺序。具体来讲,将序列分成 $ 阅读全文
posted @ 2019-04-06 01:00 shellpicker 阅读(356) 评论(0) 推荐(0)
摘要:题目大意:给定一棵 N 个节点的有根树,1 号节点为根节点,每个节点有一个颜色。有 M 个询问,每次询问以 i 为根的子树中颜色大于等于 K 的有多少种。 题解:子树询问直接 dfs 序转化成序列问题。同时注意到不带修改,且可以离线,直接莫队即可。 代码如下 cpp include define f 阅读全文
posted @ 2019-04-05 09:33 shellpicker 阅读(458) 评论(0) 推荐(0)
摘要:题目大意:给定一个长度为 N 的序列,每个点被染了一个颜色。现有 M 个询问,每个询问查询区间 [l,r] 内的点是否颜色都是不同的。 题解:莫队裸题。 直接维护区间颜色数,用 cnt[] 记录下区间中颜色出现的次数,用 now 记录下区间颜色数,查询时只需比较区间颜色数和区间长度的关系即可。 代码 阅读全文
posted @ 2019-04-04 18:08 shellpicker 阅读(167) 评论(0) 推荐(0)
摘要:题目大意:给定一个长度为 N 的序列,M 个询问,静态查询区间 [l,r] 内的不同颜色数的平方和。 题解:直接莫队即可。 代码如下 cpp include define pb push_back define mp make_pair define all(x) x.begin(),x.end() 阅读全文
posted @ 2019-03-28 23:20 shellpicker 阅读(138) 评论(0) 推荐(0)
摘要:莫队算法是一种针对询问进行分块的离线算法,如果已知区间 [ l , r ] 内的答案,并且可以在较快的时间内统计出区间 [ l 1, r ],[ l , r+1 ] 的答案,即可使用莫队算法。 莫队复杂度证明如下: 假设有 $O(\sqrt n)$ 个询问在不同块(块与块的间隔处)中,有 $O(\s 阅读全文
posted @ 2018-11-02 16:54 shellpicker 阅读(173) 评论(0) 推荐(0)