首页 > 其他分享 >P3901 数列找不同 【莫队】

P3901 数列找不同 【莫队】

时间:2023-10-04 18:45:33浏览次数:32  
标签:cnt 数列 int sum pos ++ P3901 莫队

P3901 数列找不同

莫队:一种离线处理的优化暴力解法,时间复杂度在n * n^(1/2),会被卡常数,但是极为简单
推荐视频:莫队算法

点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int a[N];
int pos[N];
struct node {
	int l, r, k;
}t[N];
string s[N];
int cnt[N],sum;
void Add(int x) {
	cnt[a[x]]++;
	if (cnt[a[x]] == 1) sum++;
}
void Sub(int x) {
	cnt[a[x]]--;
	if (cnt[a[x]] == 0) sum--;
}
int main() {
	int n,m;
	cin >> n>>m;
	for (int i = 1; i <= n; i++) cin >> a[i];
	int siz = sqrt(n);
	for (int i = 1; i <= n; i++) {
		pos[i] = i / siz;//分区块
	}
	for (int i = 1; i <= m; i++) {
		cin >> t[i].l >> t[i].r;
		t[i].k = i;//离线处理
	}
	sort(t + 1, t + 1 + m, [](node a, node b) {
		return pos[a.l] == pos[b.l] ? a.r < b.r : pos[a.l] < pos[b.l];//排序,如果在一个区块以右端点排序,不在同一区块以区块顺序排序
		});
	int l = 1, r = 0;//初始化
	for (int i = 1; i <= m; i++) {
		while (t[i].l <  l) Add(--l);//目标点在左,跟新且加上当前点
		while (t[i].r > r) Add(++r);
		while (t[i].l > l) Sub(l++);//减去
		while (t[i].r < r) Sub(r--);
		if (t[i].r - t[i].l + 1 == sum) s[t[i].k] = "Yes";
		else s[t[i].k] = "No";
	}
	for (int i = 1; i <= m; i++) {
		cout << s[i] << '\n';
	}
	return 0;
}

标签:cnt,数列,int,sum,pos,++,P3901,莫队
From: https://www.cnblogs.com/bu-fan/p/17742565.html

相关文章

  • 关于斐波那契数列 - 2 (平方的和)
    令斐波那契数列的第\(i\)项定义为\(b_i\)。再令\(f_n=\underset{i=1}{\overset{n}{\sum}}b^2_i\)结论:\(f_n=b_n\timesb_{n+1}\)首先,不难发现,该结论对于\(n=1\)和\(n=2\)一定是成立的\[f_1=1=1\times1\]\[f_2=1+1=2=1\times2\]......
  • 关于斐波那契数列 - 1
    令斐波那契数列第\(i\)个为\(F_i\)\(F_0=0,F_1=1,F_2=1\…\…\)结论:\(F_n^2=F_{n-1}F_{n+1}-(-1)^n\)不难发现,这一结论对于\(n=1\)显然是成立的接下来,运用数学归纳法若该结论对于\(n=k-1\)成立则\(F_{k-1}^2=F_{k-2}F_{k}-(-1)^{k......
  • 「高等数学」1.2 数列的极限
    数列极限的定义数列概念:如果按照某一法则,对每个\(n\in\mathbf{N_{+}}\),对应着一个确定的实数\(x_n\),这些实数按照下标\(n\)从小到大排列得到的一个序列\[x_1,x_2,x_3,\dots,x_n,\dots\]就叫做数列,简记为数列\(\left\{x_n\right\}\).数列中的每一个数......
  • 以下是一个复杂的 C 语言代码示例,展示了如何使用递归函数来计算斐波那契数列: ```c #i
    以下是一个复杂的C语言代码示例,展示了如何使用递归函数来计算斐波那契数列:#include<stdio.h>//递归函数计算斐波那契数列intfibonacci(intn){if(n<=1){returnn;}returnfibonacci(n-1)+fibonacci(n-2);}intmain(){intnum;......
  • 数列
    起因坐车两小时准备来道简单的数列题,然后发现不会做()时隔两个月再回来看看((然后和数列求导放缩的一起写了待我写完政治(虚弱题目设数列{\(a_n\)}的前n项和\(S_n=pn^2+qn\).若\(a_1^2\)+\(a_3^2\)\(\leq\)10,求\(a_3\)+\(a_4\)+\(a_5\)的最大值,并求此时\(p\)、\(q\)的值.解法......
  • [Резюме] 基础数列分块
    Preface分块可以\(O(n\sqrt{n})\)解决不能用线段树解决的问题,即不能快速合并区间信息的问题,是很多高级算法与数据结构的基础。本篇只是作者基础入门的一些感受,例题为\(\text{LOJ}[6277,6285]\),下一步计划学习莫队算法,这里有学习总结。Content0如何分块?考虑将标准块大小定......
  • 二阶差分——进行一个等差数列的加
    一般的差分用于对一段区间进行加减,但如果在该区间内加减的是一段等差数列呢?对于一段区间[l,r],加一段首项为s,末项为e的等差数列。其公差d=(s-e)/(r-l+1)为简化问题讨论,先假设这段区间都为0。原数组:0000000添加后的数组:0046800第一次差分:00422-8......
  • P1182 数列分段 Section II 题解
    Problem考察知识点:二分、贪心。题目描述对于给定的一个数组,现要将其分成\(M\)段,并要求每段连续,且每段和的最大值最小。思路二分答案出每段和最大值的最小值,然后贪心检验是否满足。难点在\(check\)上。策略:每次开始循环,如果没有超范围,就一直选,知道选满为止,求最大值。代......
  • 【算法】莫队
    一、概念莫队是一种应用于离线询问的优美暴力算法。它是主要思想是让区间的左端点和右端点移动的距离加起来最短。二、实现假设现在有这样一串序列:\(1,1,4,5,1,4\),我们现在要求询问区间内的\(1\)的出现次数。如果我们现在已经统计到了区间\((2,3)\),现在询问\((1,5)\)。现......
  • 莫队
    使用场景:1.离线算法2.静态区间询问3.对于询问\([L,R]\),可以\(O(1/log)\)从\([L+1,R]\)或\([L,R-1]\)转移过来算法思想:将\(L\)视为横轴,\(R\)视为纵轴,则一次区间询问可以视为坐标系中的一个点。\(Q\)次询问的转移构成一棵生成树。当取曼哈顿距离的最小生成树,转移的总代价......