首页 > 其他分享 >莫队

莫队

时间:2023-04-02 15:46:19浏览次数:38  
标签:cnt int mo ++ 莫队 sum block

解决离线区间询问问题
如果从 \([l, r]\) 的答案能够 \(O(1)\) 扩展到相邻区间的答案,莫队算法可以 \(O(n\sqrt n)\) 求出所有询问的答案

普通莫队例题:https://codeforces.com/problemset/problem/86/D

代码:

#include<bits/stdc++.h>
using namespace std;
using LL = long long;
const int N = 2e5 + 10, M = 1e6 + 10;
LL sum, ans[N], cnt[M], a[N];
int block;
struct node{
	int l, r, id;
	bool operator < (const node & x) const{
		if (l / block != x.l / block) return l < x.l;
		if ((l / block) & 1) return r < x.r;
		return r > x.r;
	}
}mo[N];
void add(int i){
	sum -= cnt[a[i]] * cnt[a[i]] * a[i];
	cnt[a[i]] ++ ;
	sum += cnt[a[i]] * cnt[a[i]] * a[i];
}
void del(int i){
	sum -= cnt[a[i]] * cnt[a[i]] * a[i];
	cnt[a[i]] -- ;
	sum += cnt[a[i]] * cnt[a[i]] * a[i];
}
int main(){
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	int n, m;
	cin >> n >> m;
	block = sqrt(n);// n / sqrt(m * 2 / 3)
	for (int i = 1; i <= n; i ++ ){
		cin >> a[i];
	}
	for (int i = 0; i < m; i ++ ){
		cin >> mo[i].l >> mo[i].r;
		mo[i].id = i;
	}
	sort(mo, mo + m);
	
	for (int i = 0, l = 1, r = 0; i < m; i ++ ){
		while (l > mo[i].l) add( -- l);
		while (r < mo[i].r) add( ++ r);
		while (l < mo[i].l) del(l ++ );
		while (r > mo[i].r) del(r -- );
		ans[mo[i].id] = sum;
	}
	for (int i = 0; i < m; i ++ ){
		cout << ans[i] << "\n";
	}
	return 0;
}

标签:cnt,int,mo,++,莫队,sum,block
From: https://www.cnblogs.com/Hamine/p/17280589.html

相关文章

  • 莫队与分块
    分块基本思想:将长度为\(n\)的序列划分成\(\sqrtn\)块,每块的元素个数为\(\sqrtn\)。维护\(pos[i]\)表示下标\(i\)的元素所在块的编号,维护\(L[i]\)和\(R[i]......
  • *【学习笔记】(2)莫队
    莫队,是莫涛发明的一种解决区间查询等问题的离线算法,基于分块思想,复杂度一般为\(\mathcal{O}(N\sqrt{N})\)普通莫队例题:P1972[SDOI2009]HH的项链(其实这道题用莫队过......
  • 莫队
    算法介绍如果有一个序列上的多个区间询问,并且可以离线,且某区间\([l,r]\)推到\([l+1,r],[l,r+1],[l-1,r],[l,r-1]\)是比较容易的,那么可以使用一种较好......
  • 莫队
    对于区间修改,区间查询,我们知道有线段树(链状),RMQ,树状数组,分块,树剖(树形结构)...尽管它们很优秀,但是在处理一些区间问题上,仍然有所不足。事实上,如果题目不要求在线,存在一种......
  • CF375D Tree and Queries - 树上莫队 -
    题目链接:https://codeforces.com/contest/375/problem/D题解:询问的子树可以看成求出dfs序之后的一段连续序列,因此可以使用树上莫队。首先将dfs序求出来,对于每个点,计......
  • 【YBT2023寒假Day15 C】缺口一样(数论)(莫队)(根号分治)
    缺口一样题目链接:YBT2023寒假Day15C题目大意给你一个序列,多次询问,每次问你一个区间这里面所有非空点集的最大公约数之积,对质数取模。思路首先质因子之间是独立的,考虑......
  • 莫队
    极好的bloghttps://www.cnblogs.com/WAMonster/p/10118934.html概述一下,就是区间上的双指针+分块+排序优化的优美暴力复杂度O(nsqrt(n))tobecontinue.........
  • 分块莫队学习笔记
    适用情况:对于序列A中某个子区间的问题,当遇到像众数类似的不满足区间合并的性质的数据,或者一些用线段树、树状数组比较难维护的数据时,使用分块莫队。实际上是对暴力的一种......
  • 莫队
    简介莫队是一种优美的暴力算法~(——byDaniel_yuandalao)。例题例题出自:莫队莫队大全[数据结构]莫队(建议按顺序刷题~)P3901数列找不同分析板子,速速切掉!!!代码点......
  • 简单分块与莫队
    1-分块1.1-定义分块是将要维护的信息分成若干块,而后通过维护整块的信息或者是块间的信息来优化算法。1.2-序列分块在序列上以线段树来类比,线段树是将序列每次对......