比赛 NOIP2025模拟赛3 评测结果 AAAAAAAAAAAAAAAAAAAAAAAAA
题目名称 Alternating Heights 最终得分 100
用户昵称 会挽弯弓满月 运行时间 7.073 s
代码语言 C++ 内存使用 19.14 MiB
提交时间 2025-11-26 10:41:11
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
const int N=3010;
int n,k,Q;
int a[N],h[N];
int maxn;
struct node{
	int to,nxt;
}e[N<<1];
int H[N],tot;
void add(int u,int v){
	e[++tot]={v,H[u]};
	H[u]=tot;
}
int d[N];
queue<int> q;
bool check(int l,int r){
	for(int i=0;i<=maxn;i++) H[i]=d[i]=0;
	tot=0;
	int flag;
	for(int i=l;i<r;i++){
		//1:奇数
		//0:偶数 
		flag=(i-l+1)&1;
		if(flag){
			add(a[i+1],a[i]);
			d[a[i]]++;
		}
		else{
			add(a[i],a[i+1]);
			d[a[i+1]]++;
		}
	}
	while(q.size()) q.pop();
	int num=0;
	for(int i=1;i<=maxn;i++){
		if(!d[i]){
			num++;
			q.push(i);
		}
	}
	int u,v;
	while(q.size()){
		u=q.front();q.pop();
		for(int i=H[u];i;i=e[i].nxt){
			v=e[i].to;
			d[v]--;
			if(d[v]==0){
				q.push(v);
				num++;
			}
		}
	}
	return num==maxn;
}
int ans[N][N];
void solve(int x){
	int l=x,r=x;
	while(l<=r&&r<=n){
		if(check(l,r)){
			for(int i=l;i<=r;i+=2) ans[i][r]=1;
			r++;
		}
		else{
			l+=2;
			if(l>r) r++;
		}
	}
}
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]);
		maxn=max(maxn,a[i]);
	}
	solve(1);solve(2);
	int l,r;
	while(Q--){
		scanf("%d%d",&l,&r);
		if(ans[l][r]) puts("YES");
		else puts("NO");
	}
	return 0;
}