莫队模板求助P3901
  • 板块题目总版
  • 楼主T20201126
  • 当前回复9
  • 已保存回复9
  • 发布时间2022/8/9 18:34
  • 上次更新2023/10/27 16:14:55
查看原帖
莫队模板求助P3901
419474
T20201126楼主2022/8/9 18:34
#include<bits/stdc++.h>
using namespace std;
#define ll long long 
const ll N=100005;
ll n,m,l,r,res,num[N],ans[N],pos[N],cnt,p,a[N];
struct node{
	ll l,r,k;
	bool operator < (const node &x) const{
		if(l/cnt != x.l/cnt) return l < x.l;
		if((l/cnt) & 1)
			return r<x.r;
		return r>x.r;
	}
}xu[N];
inline ll read()
{
	ll x=0;int b=1;char c=getchar();
	while(c>'9' or c<'0') {
		if(c=='-') b=-1;
		c=getchar();
	}
	while(isdigit(c)) {
		x=x*10+c-'0';
		c=getchar();
	}
	return x*b;
}
//bool cmp(node x,node y)
//{
	//return pos[x.l]==pos[y.l]?x.r<y.r:pos[x.l]<pos[y.l];
//}
void add(ll w)
{
	++num[a[w]];
	if(num[a[w]]>1) ++res;
	return ; 
}
void sub(ll w)
{
	--num[a[w]];
	if(num[a[w]]==1) --res;
	return ; 
}
int main()
{
	n=read();m=read(); cnt=sqrt(n);
	for(int i=1;i<=n;++i) 
	{
		a[i]=read();
		pos[i]=i/cnt;
	}
	for(int i=1;i<=m;++i) 
	{
		xu[i].l=read();xu[i].r=read();
		xu[i].k=i;
	}
	sort(xu+1,xu+1+m);
	for(int i=1;i<=m;++i) 
	{
		p=0;
		while(xu[i].l<l) add(--l);
		while(xu[i].l>l) sub(l++);
		while(xu[i].r<r) sub(r--);
		while(xu[i].r>r) add(++r);
		ans[xu[i].k]=res;
	}
	for(int i=1;i<=m;++i)
	if(ans[i]>0) printf("No\n");
		else printf("Yes\n");  
	return 0;
} 
2022/8/9 18:34
加载中...