比赛 NOIP2025模拟赛3 评测结果 AAAAAAAAAAAAAAAAAAAAAAAAA
题目名称 Alternating Heights 最终得分 100
用户昵称 徐诗畅 运行时间 15.911 s
代码语言 C++ 内存使用 3.83 MiB
提交时间 2025-11-26 09:27:11
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
const int N=3005;
int n,k,q,a[N],ans[N],head[N],cnt,inq[N],deg[N];
struct edge{int v,nex;}e[N];
void addedge(int u,int v){
	e[++cnt].v=v;
	e[cnt].nex=head[u];
	head[u]=cnt;
}
bool check(int s,int x){
	if(x>n) return 1;
	memset(inq,0,sizeof(inq));
	memset(deg,0,sizeof(deg));
	memset(e,0,sizeof(e));
	memset(head,0,sizeof(head)); cnt=0;
	bool dir=0;
	for(int i = s+1;i<=x;i++){
		if(!dir) addedge(a[i],a[i-1]),deg[a[i-1]]++;
		else addedge(a[i-1],a[i]),deg[a[i]]++;
		dir=!dir;
	}
	queue<int> q;
	for(int i = 1;i<=k;i++){
		if(deg[i]==0){
			q.push(i);
			inq[i]=1;
		}
	}
	while(!q.empty()){
		int u = q.front(); q.pop();
		for(int i = head[u];i;i=e[i].nex){
			int v=e[i].v; deg[v]--;
			if(deg[v]==0){
				q.push(v);
				inq[v]=1;
			}
		}
	}
	for(int i = 1;i<=k;i++)
	if(!inq[i]) return 0;
	return 1;
}
int main(){
	freopen("Heights.in","r",stdin);
	freopen("Heights.out","w",stdout);
	scanf("%d%d%d",&n,&k,&q);
	for(int i = 1;i<=n;i++) scanf("%d",&a[i]);
	for(int i = 1;i<=n;i++){
		int l = i,r=n+1;
		while(l<r){
			int mid=(l+r+1)>>1;
			if(check(i,mid)) l=mid;
			else r=mid-1;
		}
		ans[i]=l;// cout<<i<<" "<<l<<endl; 
	}
	while(q--){
		int l,r; scanf("%d%d",&l,&r);
		if(ans[l]<r) puts("NO");
		else puts("YES");
	}
	return 0;
}