萌新刚学莫队,爆零求助
查看原帖
萌新刚学莫队,爆零求助
234623
zlx517楼主2020/9/4 11:48
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <vector>
using namespace std;
const int maxn = 1008611;
int a[maxn],num[maxn];
bool ans[maxn];
struct node
{
	int l,r,pos;
}c;
vector <node> v[maxn];
bool cmp(node x,node y)
{
	if(x.r == y.r) return x.l < y.l;
	return x.r < y.r;
}
int Push(int x)
{
	num[a[x]]++;
	//cout<<'*'<<x<<' '<<num[a[x]]<<endl;
	if(num[a[x]] <= 1) return 1;
	return 0;
}
int Del(int x)
{
	num[a[x]]--;
	//cout<<'#'<<x<<' '<<num[a[x]]<<endl;
	if(num[a[x]] <= 1) return -1;
	return 0;
}
int main()
{
	int n,m;
	scanf("%d%d",&n,&m);
	int key = sqrt(n) + 1;
	for(int i = 1; i <= n; i++)
	{
		scanf("%d",&a[i]);
	}
	for(int i = 1; i <= m; i++)
	{
		scanf("%d%d",&c.l,&c.r);
		c.pos = i;
		for(int j = 1; j <= key; j++)
		{
			if(c.l >= (j - 1) * key + 1 && c.l <= j * key) v[j].push_back(c);
		}
	}
	for(int i = 1; i <= 320; i++)
	{
		if(v[i].size() == 0) continue;
		sort(v[i].begin(),v[i].end(),cmp);
		int l = v[i][0].l;
		int r = v[i][0].r;
		int sum = 0;
		memset(num,0,sizeof(num));
		for(int j = v[i][0].l; j <= v[i][0].r; j++)
		{
			int y = Push(j);
			sum += y;
		}
		if(sum == r - l + 1) ans[v[i][0].pos] = 1;
		for(int j = 1; j < v[i].size(); j++)
		{
			while(r < v[i][j].r)
			{
				r++;
				//cout<<v[i][j].r<<endl;
				sum += Push(r);
			}
			while(l < v[i][j].l)
			{
				
				//cout<<v[i][j].l<<endl;
				sum += Del(l);
				l++;
			}
			while(l > v[i][j].l)
			{
				l--;
				//cout<<v[i][j].l<<endl;
				sum += Push(l);
			}
			//cout<<v[i][j].r<<endl;
			if(sum == r - l + 1) ans[v[i][j].pos] = 1;
		}
	}
	for(int i = 1; i <= m; i++)
	{
		if(ans[i]) printf("Yes\n");
		else printf("No\n");
	}
	return 0;
}
2020/9/4 11:48
加载中...