P3901 数列找不同

Posted hahaha2124652975

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P3901 数列找不同相关的知识,希望对你有一定的参考价值。

莫队

#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstdio>
using namespace std;
const int N=100006;

int n,m,l,r,nu,q;
int ar[N],num[N],ans[N];
struct node
	int x,y,z;
a[N];

int get()
	char zy=getchar();
	int z=1,y=0;
	while(zy>‘9‘||zy<‘0‘)
		if(zy==‘-‘)z=-1;
		zy=getchar();
	
	while(zy>=‘0‘&&zy<=‘9‘)
		y=y*10+zy-‘0‘;
		zy=getchar();
	
	return z*y;


bool cmp(node a,node b)
	return (a.x/q)==(b.x/q)?a.y<b.y:(a.x/q)<(b.x/q);


void add(int p)
	num[ar[p]]++;
	if(num[ar[p]]==2)nu++;


void del(int p)
	num[ar[p]]--;
	if(num[ar[p]]==1)nu--;


int main()
	n=get();m=get();
	q=sqrt(n);
	for(int i=1;i<=n;i++)
		ar[i]=get();
	
	for(int i=1;i<=m;i++)
		a[i].x=get();
		a[i].y=get();
		a[i].z=i;
	
	sort(a+1,a+1+m,cmp);
	for(int i=1;i<=m;i++)
		while(r<a[i].y)add(++r);
		while(l>a[i].x)add(--l);
		while(r>a[i].y)del(r--);
		while(l<a[i].x)del(l++);
		if(!nu) ans[a[i].z]=1;
	
	for(int i=1;i<=m;i++)
		if(ans[i]) printf("Yes\n");
		else printf("No\n");
	
	return 0;

  

以上是关于P3901 数列找不同的主要内容,如果未能解决你的问题,请参考以下文章

刷题洛谷 P3901 数列找不同

luogu P3901 数列找不同 题解

题解Luogu P3901 数列找不同

莫队算法

数列找不同

有界的发散数列,一定会存在两个极限值不同的收敛子列,该怎么证明。