比赛 NOIP2025模拟赛3 评测结果 AAAAAAAAAAAAAAAAAAAAAAAAA
题目名称 Alternating Heights 最终得分 100
用户昵称 郑霁桓 运行时间 44.285 s
代码语言 C++ 内存使用 19.16 MiB
提交时间 2025-11-26 11:08:47
显示代码纯文本
#include<bits/stdc++.h>
using namespace std; 
int n,k,q,xx,yy,a[3005],p[3005],as[3005][3005],tot;
int dfn[3005],low[3005],st[3005],tp,tim,pp;
vector<pair<int,int> >v[3005];
inline bool tarjan(int x){
	int y;
	dfn[x]=low[x]=++tot;
	st[tp]=x;
	tp++;
	p[x]=1;
	for(int i=0;i<v[x].size();i++){
		if(v[x][i].second>tim) continue;
		y=v[x][i].first;
		if(dfn[y]==0){
			if(!tarjan(y)) return false;
			low[x]=min(low[x],low[y]);
		}else if(p[y]){
			low[x]=min(low[x],low[y]);	
		} 
	}
	if(low[x]==dfn[x]){
		pp++;
		tp--;
		y=st[tp];
		p[y]=0;
		while(x!=y){
			return false;
		}
	}
	return true;
}
inline bool f(int x){
	tot=tp=pp=0;
	tim=x;
	for(int i=1;i<=n;i++){
		dfn[i]=low[i]=p[i]=0;
	}
	for(int i=1;i<=n;i++){
		if(!dfn[i]){
			if(!tarjan(i)) return false;
		}
	}
	if(pp<n) return false;
	return true;
}
int main(){
	freopen("Heights.in","r",stdin);
	freopen("Heights.out","w",stdout);
	ios::sync_with_stdio(false);
	cin>>n>>k>>q;
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++) v[j].clear();
		int l=i+1,r=n,md;
		for(int j=i+1;j<=n;j++){
			if(a[j-1]==a[j]){
				r=j-1;
				break;
			}
			if((j-i)%2) v[a[j-1]].push_back({a[j],j});
			else v[a[j]].push_back({a[j-1],j});
		}
		while(l<=r){
			md=(l+r)>>1;
			if(f(md)) l=md+1;
			else r=md-1;
		}
		for(int j=i;j<=l-1;j++){
			as[i][j]=1;
		}
	}
	while(q--){
		cin>>xx>>yy;
		if(as[xx][yy]) cout<<"YES\n";
		else cout<<"NO\n";
	}
    return 0;
}