比赛 NOIP2025模拟赛3 评测结果 AAAAAAAAAAAAAAAAAAAAAAAAA
题目名称 Alternating Heights 最终得分 100
用户昵称 123 运行时间 15.398 s
代码语言 C++ 内存使用 19.11 MiB
提交时间 2025-11-26 11:04:50
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
const int N=3030;
int n,k,q,a[N],vis[N],f[N][N],idx[N],nxt[N],val[N],head[N],tot=0,dfn[N],low[N],cnt=0;
stack<int> st;
inline void read(int &x)
{
	int cnt=0;
	char c=getchar();
	while (!('0'<=c && c<='9')) c=getchar();
	while ('0'<=c && c<='9') cnt=cnt*10+(c-'0'),c=getchar();
	x=cnt;
}
inline void add(int x,int y,int z)
{
	idx[++tot]=y;
	val[tot]=z;
	nxt[tot]=head[x];
	head[x]=tot;
}
inline int Tarjan(int now,int x)
{
	dfn[now]=low[now]=++cnt;
	vis[now]=1;
	st.push(now);
	for (int i=head[now];i;i=nxt[i])
	{
		if (val[i]>x) continue; 
		int y=idx[i];
		if (y==now) return 1;
		if (!dfn[y])
		{
			if (Tarjan(y,x)) return 1;
			low[now]=min(low[now],low[y]);
		}
		else if (vis[y])
		{
			low[now]=min(low[now],low[y]);	
		}
	}
	if (low[now]==dfn[now])
	{
		int y=0,w=0;
		while (y=st.top())
		{   
			st.pop();
			vis[y]=0;
			w++;
			if (now==y) break;
		}
		if (w>1) return 1;
	}
	return 0;
}
inline int check(int mid)
{
	memset(dfn,0,sizeof(dfn));
	memset(low,0,sizeof(low));
	memset(vis,0,sizeof(vis));
	cnt=0;
	for (int i=1;i<=k;i++)
	{
		if (!vis[i])
		{
			while (!st.empty()) st.pop();
			if (Tarjan(i,mid)) return 1; 
		}
	}
	return 0;
}
int main() {
	freopen("Heights.in","r",stdin);
	freopen("Heights.out","w",stdout); 
	read(n),read(k),read(q);
	for (int i=1;i<=n;i++) read(a[i]);
	for (int i=1;i<n;i++)
	{
//		cout<<"It is "<<i<<endl;
		memset(head,0,sizeof(head));
		tot=0;
		for (int j=i+1;j<=n;j++)
		{
			if (((j-i)%2)) add(a[j],a[j-1],j);
			else add(a[j-1],a[j],j); 
		}
		int l=i,r=n;
		while (l<r)
		{
			int mid=(l+r+1)/2;
			if (!check(mid)) l=mid;
			else r=mid-1;
		}
		for (int j=i+1;j<=l;j++) f[i][j]=1; 
//		for (int j=i+1;j<=n;j++)
//		{
//			cout<<i<<" "<<j<<" "<<f[i][j]<<endl;
//		}
	}
	while (q--)
	{
		int x,y; 
		read(x),read(y);
		if (f[x][y]) printf("YES\n");
		else printf("NO\n"); 
	}
}