萌新刚学莫队,全wa求助/kel
查看原帖
萌新刚学莫队,全wa求助/kel
224978
optimize_2楼主2020/8/10 18:56

RT.

#include<bits/stdc++.h>
using namespace std;

int l,r,n,m,belong[1000010];

struct query {
	int l,r,id;
	bool flag;
} q[100010];

bool cmp1(query a,query b) {
	if(belong[a.l]==belong[b.l]) return a.r<b.r;
	else return a.l<b.l;
}

bool cmp2(query a,query b) {
	return a.id<b.id;
}

int a[100010],cnt[100010];
int sum;

void addl() {
	cnt[a[l]]--;
	if(cnt[a[l]]==0) sum--;
	l++;
//	cout<<"ADD L   l:"<<l<<endl;
//	for(int i=1;i<=4;i++) cout<<cnt[i]<<" ";
	cout<<endl;
}

void addr() {
	r++;
	cnt[a[r]]++;
	if(cnt[a[r]]==1) sum++;
//	cout<<"ADD R   r:"<<r<<endl;
//	for(int i=1;i<=4;i++) cout<<cnt[i]<<" ";
	cout<<endl;
}

void minl() {
	l--;
	cnt[a[l]]++;
	if(cnt[a[l]]==1) sum++;
//	cout<<"MIN L   l:"<<l<<endl;
//	for(int i=1;i<=4;i++) cout<<cnt[i]<<" ";
	cout<<endl;
}

void minr() {
	cnt[a[r]]--;
	if(cnt[a[r]]==0) sum--;
	r--;
//	cout<<"MIN R   r:"<<r<<endl;
//	for(int i=1;i<=4;i++) cout<<cnt[i]<<" ";
	cout<<endl;
}

int main() {
	scanf("%d%d",&n,&m);
	int s=sqrt(n);
	for(int i=1;i<=s;i++) {
		for(int j=1;j<=s;j++) {
			belong[(i-1)*s+j]=i;
		}
	}
	for(int i=s*s+1;i<=n;i++) belong[i]=s+1;
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	for(int i=1;i<=m;i++) scanf("%d%d",&q[i].l,&q[i].r),q[i].id=i;
	sort(q+1,q+m+1,cmp1);
	l=1;
	r=1;
	cnt[a[l]]=1;
	sum=1;
	for(int i=1;i<=m;i++) {
		while(l<q[i].l) addl();
		while(l>q[i].l) minl();
		while(r>q[i].r) minr();
		while(r<q[i].r) addr();
		if(sum==q[i].r-q[i].l+1) q[i].flag=1;
	}
	sort(q+1,q+m+1,cmp2);
	for(int i=1;i<=m;i++) {
		if(q[i].flag) puts("Yes");
		else puts("No");
	}
}
2020/8/10 18:56
加载中...