码迷,mamicode.com
首页 > 其他好文 > 详细

P3901 数列找不同

时间:2019-07-24 13:28:12      阅读:69      评论:0      收藏:0      [点我收藏+]

标签:return   const   while   bool   void   sort   csharp   lse   ==   

莫队

#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 数列找不同

标签:return   const   while   bool   void   sort   csharp   lse   ==   

原文地址:https://www.cnblogs.com/hahaha2124652975/p/11237240.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!