| 比赛 |
NOIP2025模拟赛3 |
评测结果 |
AAAAAAAAAAAAAAAAAAAAAAAAA |
| 题目名称 |
Alternating Heights |
最终得分 |
100 |
| 用户昵称 |
梦那边的美好TE |
运行时间 |
21.824 s |
| 代码语言 |
C++ |
内存使用 |
3.87 MiB |
| 提交时间 |
2025-11-26 09:31:45 |
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <queue>
#include <vector>
using namespace std;
const int N=3005;
int n,k,m,lim[N],a[N],d[N];
queue<int>q;
vector<int>G[N];
void add(int x,int y){
G[x].push_back(y);
d[y]++;
}
bool check(int l,int r){
for(int i=1;i<=k;i++){
G[i].clear();
d[i]=0;
}
for(int i=l;i<r;i++){
if((i-l)&1)add(a[i+1],a[i]);
else add(a[i],a[i+1]);
}
for(int i=1;i<=k;i++){
if(!d[i])q.push(i);
}
while(q.size()){
int x=q.front();q.pop();
for(auto y:G[x]){
d[y]--;
if(!d[y])q.push(y);
}
}
bool flag=1;
for(int i=1;i<=k;i++){
if(d[i])flag=0;
}
return flag;;
}
int main(){
freopen("Heights.in","r",stdin);
freopen("Heights.out","w",stdout);
scanf("%d %d %d",&n,&k,&m);
for(int i=1;i<=n;i++){
scanf("%d",a+i);
}
for(int i=1;i<=n;i++){
int L=i,R=n,mid;
while(L<R){
mid=(L+R)+1>>1;
if(check(i,mid))L=mid;
else R=mid-1;
}
lim[i]=L;
}
while(m--){
int x,y;scanf("%d %d",&x,&y);
if(lim[x]>=y)printf("YES\n");
else printf("NO\n");
}
return 0;
}