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