| 比赛 |
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");
}
}