![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
=====莫队=====
Qingo呀
老菜鸡。
展开
-
HDU - 5213 Lucky (莫队+容斥原理)
题链:https://vjudge.net/problem/HDU-5213题意:求[L,R]和[U,V]区间中,有多少对 ax+ay==k ?其中 L<=x<=R,U<=y<=V。题目保证 L<=R<U<=V.思路:容斥原理,设sum(l,r)代表有[L,R]中有sum(l,r)对ax+ay==k,l<=x<=r.那么,答案为sum(l,v)-sum(l,u-1)-sum(r+1,v)+sum(r+1,u-1)。每个询问拆成4个询问,莫队一下即原创 2020-12-02 21:40:58 · 184 阅读 · 0 评论 -
NBUT - 1457 Sona (莫队)
题链:https://vjudge.net/problem/NBUT-1457/origin题意:求区间内,每个数出现次数x的立方和。思路:模板题。添加时,由k^3->(k+1)^3,多了3*k^2+3*k+1。删除时,k+1->k,少了3*k^2+3*k+1。#include <cstdio>#include <algorithm>#include <cmath>#define ll long longusing namespace s原创 2020-12-02 21:19:58 · 221 阅读 · 0 评论 -
HDU - 5145 NPY and girls(莫队+组合数学+逆元)
题链:https://vjudge.net/problem/HDU-5145题意:给一个区间[L,R],问a[L],a[L+1],a[L+2], ... ,a[R].可以组成多少不同的排列。思路:(太菜了太菜了,果然坤坤做的题就是牛,明明就是很简单的组合数学,就是不会做。。。)设代表区间内有个x。假设区间的长度为n,且有k个不同的数。显然。其实就是,把这n个位置放满的不同方案。根据分类相加,分步相乘,我们一步一步的放。那么答案就是。考虑添加,假设之前区间长度为len,答案为sum。那么,现在答案原创 2020-12-02 21:13:29 · 149 阅读 · 0 评论 -
HDU - 6534 Chika and Friendly Pairs (莫队+离散化+树状数组)
题链:https://vjudge.net/problem/HDU-6534题意:问区间[L,R]内,有多少对 (i,j) 满足 ai < aj 且 abs(ai-aj) <= k ?思路:莫队分块一下,对于ai 要找的是有多少ai-k<= aj <= ai+k ,树状数组求即可。实现1:998ms直接无脑实现#include <bits/stdc++.h>#define ll long longusing namespace std;cons..原创 2020-12-01 22:42:27 · 152 阅读 · 0 评论 -
HDU - 6333 Problem B. Harvest of Apples (莫队+组合数学+重要公式)
题链:https://vjudge.net/problem/HDU-6333题意:给出n,m,求。思路:首先,题目保证m<=n,我们考虑把m看成l,n看成r。那么,问题就转化为了莫队解决的区间问题。首先我们定义。现在考虑添加删除操作。对于l的移动我们可以轻松的解决。当l<ql时,当l>ql时,但是对于r的移动,我们就要推一下了,我们知道组合公式可以根据杨辉三角计算,。那么我们现在解决r的移动了。当r<qr时,当r>qr时,我们都知道.原创 2020-12-01 15:59:31 · 243 阅读 · 0 评论 -
luogu P5906 【模板】回滚莫队&不删除莫队 (不删除莫队+离散化)
题链:https://www.luogu.com.cn/problem/P5906思路:维护每个数的最小坐标和最大坐标即可,添加时计算一下答案。这里要维护两组答案。#include <bits/stdc++.h>#define ll long longusing namespace std;const int N = 3e5+10;int n,m,a[N];struct node{ int l,r,id;}q[N];set<int> s;set<in原创 2020-11-30 21:15:47 · 183 阅读 · 0 评论 -
luogu AT1219 歴史の研究 (不删除莫队+离散化)
题链:https://www.luogu.com.cn/problem/AT1219思路:对于普通莫队,我们一般考虑添加和删除只是顺序变一下,但有的题删除操作根本没办法维护需要的东西。这时,不删除莫队就可以大显神威了,删除太难了,那我们不删除,只添加就好了。现在考虑怎么不删除,我们排序时,对于左端点在同一个块内的询问他们的r是从小到大有序的,那么我们可以利用这个特点,一个块一个块的计算询问区间。对于左端点在同一个块内的询问:首先考虑,如果询问区间的左右端点(ql、qr)都在一个块内,原创 2020-11-30 21:08:46 · 163 阅读 · 0 评论 -
luogu P4074 [WC2013]糖果公园 (树上带修莫队)
题链:https://www.luogu.com.cn/problem/P4074思路:用欧拉序处理成连续区间后,就和带修莫队差不多了。要注意的是,对于修改。要看看是否之前有没有被加过,加过(也就是vis[i]为1)的要减去,然后再加上新的;如果没加过就不用管。最后再加上lca的贡献就行。注意块的大小为。#include <bits/stdc++.h>#define ll long longusing namespace std;const int N = 1e5+10;c原创 2020-11-30 20:25:36 · 195 阅读 · 0 评论 -
luogu SP10707 COT2 - Count on a tree II (树上莫队+离散化)
题链:https://www.luogu.com.cn/problem/SP10707思路:树上莫队模板题。这里需要了解欧拉序(强推博客),利用欧拉序,就可以把树上的路径转化为连续区间的问题。这里还会用到LCA。对于树上u到v的路径,设first[u]<first[v],如果lca(u,v)==u,对应欧拉序的连续区间就为[ first[u] , first[v] ] ;否则,对应欧拉序的连续区间就为[ last[u] , first[v] ] , 不过还要加上 lca(u,v).原创 2020-11-30 20:07:42 · 164 阅读 · 0 评论 -
HDU - 6610 Game (带修莫队)
题链:https://vjudge.net/problem/HDU-6610题意:用到了尼姆博弈的结论。对于一个区间[L,R],问有多少子区间[l,r],a[l] ^ a[l+1] ^ a[l+2] ^ ... ^ a[r] != 0 ? 有修改,修改是将a[pos],a[pos+1]交换。思路:我们求等于0的子区间个数,再减去即可。CodeForces - 617E 的带修版。考虑修改带来的影响,首先因为前缀的思想,pre[pos-1]以及pre[pos+2] ,pre[pos+3] ,...原创 2020-11-30 19:31:08 · 168 阅读 · 0 评论 -
P1903 [国家集训队]数颜色 / 维护队列 (带修莫队模板)
题链:https://www.luogu.com.cn/problem/P1903思路:给每一个询问加一个时间戳,时间戳的取值就是之前最近的修改。排序时,先按左边界的块,再按右边界的块,最后按时间戳。先移动左右指针,然后再考虑修改。如果时间戳大了,说明我们改多了,我们需要再改回去,改的时候,要考虑是否对答案造成影响;如果时间戳小了,说明我们改少了,要改到询问所在的时间戳。注意:有的dalaodalao证明了当块的大小设时理论复杂度达到最优。不过可以证明,块大小取优于取的情况,总体复杂度。而块大小取时会退原创 2020-11-30 19:03:27 · 197 阅读 · 0 评论 -
CodeForces - 617E XOR and Favorite Number (莫队)
题链:http://codeforces.com/contest/617/problem/E题意:对于一个区间[L,R],问有多少子区间[l,r],a[l] ^ a[l+1] ^ a[l+2] ^ ... ^ a[r] == k ?思路:首先,先解决这让你们求a[l] ^ a[l+1] ^ a[l+2] ^ ... ^ a[r] , 这里用前缀思想,即pre[l-1]^pre[r]。现在,我们维护一个num数组,num[k]代表pre[i]==k的个数。考虑加入一个数,那么,答案要先加上n...原创 2020-11-30 16:56:54 · 121 阅读 · 0 评论 -
luogu P3709 大爷的字符串题 (莫队+离散化)
题链:https://www.luogu.com.cn/problem/P3709题意:求区间众数出现的次数的相反数。(PS:出题人语文水平堪忧。。。)思路:首先要离散化,然后考虑加入一个数,如果比当前众数出现的次数多,那么更新答案;对于删除,是比较麻烦的,我们维护两个数组cnt和num,cnt[i]代表i出现的次数,num[i]代表出现次数为i的数的个数。如果删除的这个数(假设为k)是当前的众数,那么我们看看num[cnt[k]]是否为1,如果为1,那么答案就要变为cnt[k]-1,否则答案不变。原创 2020-11-30 16:09:47 · 174 阅读 · 0 评论 -
莫队算法(普通莫队、带修莫队、树上莫队、不删除莫队)学习笔记【理解+套路/核心代码+例题及题解】
一、理解我的理解就是巧妙的暴力,利用双指针以及分块思想,巧妙的移动双指针,时间复杂度可以达到O(NlogN)。这里强推博客:写的又好又全。链接二、套路1、普通莫队int l=1,r=0;for(int i=1;i<=m;i++){ int ql=q[i].l,qr=q[i].r; while(l<ql) del(l++); while(l>ql) add(--l); while(r<qr) add(++r); while(r>qr) de原创 2020-11-29 22:40:05 · 669 阅读 · 0 评论 -
luogu P1494 [国家集训队]小Z的袜子 (莫队)
题链:https://www.luogu.com.cn/problem/P1494思路:考虑加入一只袜子,对于分子,假设之前有相同的k个袜子,那么方案数为k*(k-1)/2,现在变为k+1,方案数为k*(k+1)/2,增加了2*k/2;分母也类似,假设现在总共有n个袜子,那么方案数为n*(n-1)/2,现在变为n+1,方案数为n*(n+1)/2,增加了2*n/2。分子、分母都除了2,相当于不除。删除是也类似。#include <bits/stdc++.h>#define ll lon原创 2020-11-29 22:37:48 · 206 阅读 · 0 评论 -
CodeForces - 86D Powerful array (莫队)
题链:https://vjudge.net/problem/CodeForces-86D思路:与luogu P2709 小B的询问一个题,只不过加了乘s。#include <bits/stdc++.h>#define ll long longusing namespace std;const int N = 2e5+10;const int M = 1e6+10;int n,t,a[N],belong[N],base;struct node{ int l,r,id;}q原创 2020-11-29 22:17:05 · 96 阅读 · 0 评论 -
luogu P2709 小B的询问(莫队)
题链:https://www.luogu.com.cn/problem/P2709思路:考虑加入一个数对答案的影响,假设加入前出现了k次,对答案的贡献是k*k,那么现在出现了k+1次,对答案的贡献是(k+1)*(k+1)=k*k + 2*k + 1,已经统计了k*k,所以要加上2*k + 1。删除时,也是如此,所以要先将出现的次数减1,再删去贡献。#include <bits/stdc++.h>#define ll long longusing namespace std;con原创 2020-11-29 22:09:03 · 97 阅读 · 0 评论 -
luogu P1972 [SDOI2009]HH的项链 (莫队(超时)/树状数组)
题链:https://www.luogu.com.cn/problem/P1972思路1:如果考虑莫队的话就是模板题,只不过出题人卡常,会T。#include <bits/stdc++.h>#define ll long longusing namespace std;const int N = 1e6+10;const int M = 1e6+10;int n,m,base;int a[N],num[M],ans[N],belong[N],cnt=0;struct no原创 2020-11-29 21:58:20 · 119 阅读 · 1 评论 -
luogu SP3267 DQUERY - D-query (莫队)
题链:https://www.luogu.com.cn/problem/SP3267思路1:莫队模板题,直接上代码。两种排序方法,没注释的更快一些。#include <bits/stdc++.h>#define ll long longusing namespace std;const int N = 3e4+10;const int M = 1e6+10;int n,m,base;int a[N],num[M],ans[N*10],belong[N],cnt=0;str原创 2020-11-29 21:36:58 · 113 阅读 · 0 评论