
莫队
穷源溯流
路很长,尽管走便是。
-
原创 洛谷 AT1219 歴史の研究(回滚莫队)
按照莫队的思路,添加一个数很简单,只要判断是否需要更新答案即可;但是删除一个数就要重新找的最值,时间复杂度 O(n) 可以按照值域分块来做,但是值域分块没有回滚速度快的说 const int N=1e5+5; int n,m; int i,j,k; int a[N]; struct Query { int l,r; int id; void read(){ sdd(l,r); } }q[...2021-02-02 22:32:4228
0
-
原创 洛谷 P5268 [SNOI2017]一个简单的询问(莫队+思维)
题目要求两个区间之间的关系,一定要容斥来做的,但是在 [r1,l2] 之间添一段来容斥是远远不够的 令 原式 容斥的目的是将乘法关系转化为加法关系,但是此时函数 F 还是有乘法关系 先考虑简单的,当给定的 n 个数都相同假设都为 2 吧 我们发现每个区间都是 [1,x] 也就是说,有一种类似前缀的感觉 所以在这里不得不对莫队进行改变,对于区间 [L,R] ,莫队的移动指针初始时 l=0,r=0, 开始先移动指针 l,当 l<L 时,将每一个元素 2 全部放入桶中,直...2021-02-01 16:46:2921
0
-
原创 洛谷 P4396 [AHOI2013]作业(莫队+值域分块)
抱歉,一开始读错题了 由于最后统计 [a,b] 中有多少数出现过,以及位于 [a,b] 内的数值个数 由于这两个是相关联的,所以不好一起统计,所以采用暴力的方法,但是暴力一定超时,所以在这里使用分块 写分块的时候到底需要几个参数,首先对于非整块,vis[x] x出现的次数;对于整块 cnt[x] x出现的次数,tag[x] x 出现的种数 const int N=1e5+5; int n,m; int i,j,k; int a[N]; struct Qu...2021-01-24 21:37:3019
0
-
原创 洛谷 P4137 Rmq Problem / mex(莫队+值域分块)
看到这个题目后,删除 O(1) 添加 O(n),做法就是遍历区间 [now,n] 但是最后一个点会T 看到有人说值域分块可以过,虽然最后一个点过了,但是前面又过不了了,最后还是要开 O2 void add(int pos) //暴力添加代码 { int x=a[pos]; if(!vis[x] && now==x){ for(int i=x+1;i<=n+1;i++){ if(!vis[i]){ now=i; b...2021-01-24 18:23:3927
0
-
原创 训练总结
树上莫队应该是看明白了,但带修改的莫队好像又忘了,还有回滚莫队到底是什么(雾) 树上莫队采用的是欧拉序将树形结构转化为线性结构,对于刚刚回顾完树剖的我来说还是比较容易理解的,但是能记多久就不清楚了 虽然之前做过主席树的模板题,但现在重新学习就和新的一样,网上的图倒是一目了然,想了一下午竟然才知道每个节点的左右儿子并不是维护区间 昨天开了一场 CF ,题感觉考的比较偏,最近几次做题,分不清楚什么时候应该贪心,什么时候应该使用动态规划,盲目的猜结论,WA了之后才想要造个数据推翻,沉不住气。 这周一道关于2021-01-23 22:04:1830
0
-
原创 洛谷 P3730 曼哈顿交易(莫队+值域分块)
题目应该算是莫队里面比较难的(蒟蒻的我自我安慰) 求区间第 k 小数不由得想到主席树,但这是类似于众数的形式,所以还是考虑莫队 但是莫队之前做过一道求众数的大小的题目,是否可以向这方面靠拢,一定要有一个数组记录 x 出现的次数,记为 a 数组。再添加一个出现过 x 次的数有多少次的数组,记为数组 b。 以上两个数组是最基本的,我们要求区间内第 k 小的出现次数,暴力的话就是顺序遍历 b 数组数到 k,但是时间复杂度为 但是如果我们用分块处理一下 a 数组,这样复杂度不就变成,总体还是...2021-01-23 10:14:0820
0
-
原创 洛谷 SP10707 COT2 - Count on a tree II(树上莫队)
树上莫队,首先要将树上的编号映射至线性,这里采用欧拉序 就样例来说,所谓欧拉序就是 {1 3 7 7 5 5 66 3 4 8 8 4 2 2 1} 其实就是要求我们在 dfs 过程中,将 x 节点进栈的时间编号和出栈的时间编号全部记录下来 我们将进栈编号记为 st[x] 出栈编号记为 ed[x],再对区间进行操作时,同样分为两种情况 如果查询区间 [u,v] 在同一条链上,比如 [1,5] 那么就是 [ st[1],st[5] ] 区间,注意,只有节点 1, 3 ,5 如果查询区间...2021-01-22 17:58:2819
0
-
原创 洛谷 P3709 大爷的字符串题(莫队+贪心)
题目其实是和这道题目一样的https://www.luogu.com.cn/problem/P1997 题目中有一句话很重要将这段区间搞完后最多还会剩下多少 rp,对于题目给出的规则我们可以理解为 如果区间不为空,答案为 0 存在 a∈ S,如果 a>=x ,那么清空 S,插入 a 任意 a∈ S,如果 a<x,那么直接插入 a 规则可以理解为构造任意个严格单调上升子序列,但是为了使最后的答案最大,我们要保持构造的子序列的数量尽可能少,举个例子:我们已经构造了如...2021-01-21 22:06:4719
0
-
原创 洛谷 P3604 美好的每一天(莫队)
题目描述 回归天空是一件庄重的事情,所以卓司决定让大家分批次进行,给每个人给了一个小写字母'a'->'z'作为编号 一个区间的人如果满足他们的编号重排之后可以成为一个回文串,则他们可以一起回归天空,即这个区间可以回归天空 由于卓司是一个喜欢妄想的人,他妄想了m个区间,每次他想知道每个区间中有多少个子区间可以回归天空 因为世界末日要来了,所以卓司的信徒很多 输入格式 第一行两个数n,m 之后一行一个长为n的字符串,代表每个人的编号 之后m行每行两个数l,r代表每次卓司妄想的区间 .2021-01-18 14:35:1018
0
-
原创 洛谷 P1903 [国家集训队]数颜色 / 维护队列(带修改的莫队)
const int N=1e6+5; int n,m; int i,j,k; int a[N]; int block,vis[N],now,ans[N]; int tim,ask,mdf; struct Query { int l,r; int tim,id; int lbel,rbel; Query(int l=0,int r=0,int tim=0,int id=0):l(l),r(r),tim(tim),i...2021-01-17 10:22:1433
1
-
原创 洛谷 P4462 [CQOI2018]异或序列(莫队)
题做多了总会遇到重复的:https://baichuan.blog.csdn.net/article/details/109961904 由于异或满足可消去律,所以求任意区间 [x,y] 是否等于 k ,可以将 a[i] 表示为 从 1 至 i 的异或值,那么任意一个 a[y] ^ a[x-1] 即为 [x,y] 之中的异或值,所以对于给定的区间 [l,r] 找到当中的所有子区间的异或值之和为 k 的区间个数,既是在 [l-1,r] 中找满足条件的二元关系<x,y> ,使得 a[y]...2021-01-15 16:42:2729
0
-
原创 洛谷 P3901 数列找不同(莫队)
莫队的简单应用 const int N=1e5+5; int n,m,t; int i,j,k; int a[N]; int vis[N],now,ans[N]; struct Query { int l,r; int bel,id; void read(){ sdd(l,r); } }q[N]; bool cmp(Query a,Query b) { return a.be...2021-01-15 15:51:1921
0
-
原创 HDU 4638 Group(莫队)
给出一个长度为 n 的序列,每次查询给一个区间,问区间可被分成多少个连续的段 其实思路并不是很难,考虑任意一个值 x ,被删除后 ,判断 x+1,x-1 是否存在,这样推出答案 以后长记性了,一定要先扩充区间。 const int N=1e5+5; int i,j,k; int n,m,t; int a[N]; struct Node { int l,r; int bel,id; bool op...2020-11-26 15:23:1733
0
-
原创 HDU 5213 Lucky(莫队+容斥)
给出 n 个数和数字 k,有 m 此询问,每次给出两个区间 [l,r] [u,v] ,问每次询问时,从两个区间内各选一个数字 x,y ,问有多少个二元组使得 x+y=k 成立 本来是打算直接用两个莫队来维护这两个区间,但是超时了,想想也是,有 e7 的级数 这个题可以将这两个区间和并,因为注意到 l,r,u,v 的关系是单调递增的,所以合并之后用一个莫队来解决,为了满足题目中所说,分别从两个区间中选择 x,y ,所以从区间 [r+1,v] 和 [l,u-1] 中选择的另一个数字是不合法的,所...2020-11-25 11:05:3644
0
-
原创 Yandex.Algorithm 2011: Round 2 D. Powerful array(莫队)
给出 n 个数,m 此询问,求区间 [l,r] 内某个数 x 的 val,val 的定义为 :(x 在区间内出现的次数)^2 * x 题目链接:http://codeforces.com/problemset/problem/86/D 用莫对维护所询问的区间即可,可以推一下假如一个数或删除一个数产生的贡献,或者直接暴力 const int N=1e6+5; int i,j,k; int n,m,t; int a[N]; struct Node...2020-11-23 09:32:4331
0
-
原创 Codeforces Round #340 (Div. 2) E. XOR and Favorite Number(莫队+前缀异或)
给出数 n,m,k ,现在有 n 个数,m 此询问,每次询问给出 l,r 代表区间,求任意满足条件的的 l <= i <= j <= r 的 i ,j 使得 a[i]^a[i+1]^……a[j]=k,求可以找出多少对 <i,j> 这样的二元组 离线问题,我们采用莫队的方法来求解 但是想要求得任意一个区间的异或值比较困难,由异或运算可得 a^b=k ---> k^b=a 所以每一次更新莫队时,例如添加一个数时,因为他不是在左端点添加就是在右端点添加,所...2020-11-22 20:09:5334
0
-
原创 洛谷P1494 [国家集训队]小Z的袜子(莫队)
从总的袜子数中任意选取 2 个作为分母,再从任意颜色相同的袜子数中选取 2 个,可以先与处理一下,这样每次更新减去上一次的值,在加上这一次的值。 虽然数据量不大,但是预处理的时候会爆 int ,累加答案的时候也会爆,所以采用 long long const int N=5e4+5; int i,j,k; int n,m,t; int a[N]; int num,block,bel[N]; struct Node { i...2020-11-22 10:13:4568
0
-
原创 洛谷P2709 小B的询问(莫队)
const int N=5e4+5; int i,j,k; int n,m,t; int a[N]; int num,block,bel[N]; int ans[N],cnt[N],cur; struct Node { int id; int l,r; }q[N]; bool cmp(Node a,Node b) { return bel[a.l]^bel[b.l] ? a.l<b.l ...2020-11-22 08:34:3025
0
-
原创 SPOJ 3267 DQUERY - D-query(莫队)
给出 n 个数,及 m 个区间,问区间内每个数 a[i] ~ a[j] 中有几个不同的数2020-08-01 23:17:5869
0
-
原创 B. Little Elephant and Array(莫队模板)
#include<iostream> #include<cstdio> #include<cstdlib> #include<string> #include<cstring> #include<cmath> #include<ctime> #include<algorithm> #include<utility> #include<stack> #include<queue...2020-07-31 22:42:5368
0