ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

莫队算法

2022-07-12 20:31:49  阅读:134  来源: 互联网

标签:return int LL nd bl 算法 莫队


普通莫队

对于询问奇偶分块

bool cmp(nd x,nd y)
{
	int lb = x.x / bl,rb = y.x / bl;
	if (lb ^ rb) return x.x < y.x; // l,r同块以l排序
	return lb & 1 ? (x.y > y.y) : (x.y < y.y); //不同则看l在什么块内
}
bool cmp(nd x,nd y){return (x.l / bl) ^ (y.l / bl) ? (x.l < y.l) : (((x.l / bl) & 1) ? x.r < y.r : x.r > y.r);}//这是另一打法

其中\(bl\)为块长,一般为\(\frac{n}{\sqrt{\frac{2}{3}m}}\)
接着即可开双指针乱移即可。

【GDKOI2014】小纪的作业题

这是一道比较模板的莫队,开个桶计次数,一个一个数加入或删除即可

\(\text{Code}\)

#include<cstdio>
#include<cmath>
#include<algorithm>
#define LL long long
using namespace std;
const int N = 1e5 + 5,P = 1e9 + 7;
int n,m,L,R,bl,d[N];
LL ans,v[N],a[N],mi[N],as[N];

struct nd{int x,y,id;}b[N];
bool cmp(nd x,nd y)
{
	int lb = x.x / bl,rb = y.x / bl;
	if (lb ^ rb) return x.x < y.x;
	return lb & 1 ? (x.y > y.y) : (x.y < y.y);
}
void Mod(LL &x,LL y){x = (x + y >= P ? x + y - P : x + y);}
LL fpow(int x,LL y)
{
	LL res = 1;
	for (; x; x >>= 1,y = y * y % P)
		if (x & 1) res = res * y % P;
	return res;
}
void Insert(int x)
{
	LL g1 = v[a[x]],g2 = v[a[x]] * a[x] % P;
	if (!d[a[x]]) g1 = 0;
	Mod(ans,P - g1),Mod(ans,g2),d[a[x]]++,v[a[x]] = v[a[x]] * a[x] % P;
}
void Delete(int x)
{
	LL g1 = v[a[x]] * mi[a[x]] % P,g2 = v[a[x]];
	if (d[a[x]] <= 1) g1 = 0;
	Mod(ans,g1),Mod(ans,P - g2),d[a[x]]--,v[a[x]] = v[a[x]] * mi[a[x]] % P;
}
LL work(int l,int r)
{
	while (R < r) R++,Insert(R);
	while (L > l) L--,Insert(L);
	while (R > r) Delete(R),R--;
	while (L < l) Delete(L),L++;
	return ans;
}
int main()
{
	scanf("%d%d",&n,&m),bl = n / (sqrt(2 * m / 3));
	for (int i = 1; i <= n; i++) scanf("%d",&a[i]),mi[a[i]] = fpow(P - 2,a[i]),v[a[i]] = 1;
	for (int i = 1; i <= m; i++) scanf("%d%d",&b[i].x,&b[i].y),b[i].id = i;
 	sort(b + 1,b + 1 + m,cmp); L = 1,R = 0;
 	for (int i = 1; i <= m; i++) as[b[i].id] = work(b[i].x,b[i].y);
	for (int i = 1; i <= m; i++) printf("%lld\n",as[i]); 
}

树上莫队

就是在树上跑莫队,对于序列很好去跑莫队,那树呢?
没错,就是将树变成序列,与\(LCA\)有关的问题常常以树的欧拉序来跑莫队。

标签:return,int,LL,nd,bl,算法,莫队
来源: https://www.cnblogs.com/nibabadeboke/p/15997686.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有