萌新刚学 OI,求助卡常 90pts
查看原帖
萌新刚学 OI,求助卡常 90pts
298549
SIXIANG32楼主2021/1/2 22:26

RT
刚学莫队写的,可能对莫队的理解不够深入,求助/kk

#include<cstdio>
#include<algorithm>
#include<cmath>
#define MAXN 300010
using namespace std;
struct node{
	int l,r,ind,cl;
};
node in[MAXN];
int cnt[MAXN],a[MAXN],ans[MAXN],k=0;
inline int read()
{
	register int x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9')x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
	return x*f;
}
inline bool cmp(node &x,node &y)
{
	return ((x.cl!=y.cl)?(x.l<y.l):((x.cl&1)?(x.r<y.r):(x.r>y.r)));
}
inline void add(int v)
{
	if(++cnt[a[v]]==1)
		k++;
}
inline void del(int v)
{
	if(--cnt[a[v]]==0)
		k--;
}
signed main()
{
	//freopen(".in","r",stdin);
	//freopen(".out","w",stdout);
	int n,m,len,l=1,r=0;
	n=read(),m=read(),len=pow(n,2.0/3.0);
	for(register int p=1;p<=n;p++)
		a[p]=read(); 
	for(register int p=1,L_,R_;p<=m;p++)
	{
		L_=read(),R_=read();
		in[p].l=L_,in[p].r=R_,in[p].ind=p,in[p].cl=(p-1)/len+1;
	}
	sort(in+1,in+m+1,cmp);
	for(register int p=1;p<=m;p++)
	{
		while(l<in[p].l)del(l++);
		while(l>in[p].l)add(--l);
		while(r<in[p].r)add(++r);
		while(r>in[p].r)del(r--); 
		ans[in[p].ind]=int((k==in[p].r-in[p].l+1)?1:0);
	}
	for(register int p=1;p<=m;p++)
		if(ans[p])puts("Yes");
		else puts("No"); 
}
2021/1/2 22:26
加载中...