| 比赛 |
NOIP2025模拟赛3 |
评测结果 |
AAAAAAAAAAAAAAAAAAAAAAAAA |
| 题目名称 |
Alternating Heights |
最终得分 |
100 |
| 用户昵称 |
会挽弯弓满月 |
运行时间 |
7.073 s |
| 代码语言 |
C++ |
内存使用 |
19.14 MiB |
| 提交时间 |
2025-11-26 10:41:11 |
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
const int N=3010;
int n,k,Q;
int a[N],h[N];
int maxn;
struct node{
int to,nxt;
}e[N<<1];
int H[N],tot;
void add(int u,int v){
e[++tot]={v,H[u]};
H[u]=tot;
}
int d[N];
queue<int> q;
bool check(int l,int r){
for(int i=0;i<=maxn;i++) H[i]=d[i]=0;
tot=0;
int flag;
for(int i=l;i<r;i++){
//1:奇数
//0:偶数
flag=(i-l+1)&1;
if(flag){
add(a[i+1],a[i]);
d[a[i]]++;
}
else{
add(a[i],a[i+1]);
d[a[i+1]]++;
}
}
while(q.size()) q.pop();
int num=0;
for(int i=1;i<=maxn;i++){
if(!d[i]){
num++;
q.push(i);
}
}
int u,v;
while(q.size()){
u=q.front();q.pop();
for(int i=H[u];i;i=e[i].nxt){
v=e[i].to;
d[v]--;
if(d[v]==0){
q.push(v);
num++;
}
}
}
return num==maxn;
}
int ans[N][N];
void solve(int x){
int l=x,r=x;
while(l<=r&&r<=n){
if(check(l,r)){
for(int i=l;i<=r;i+=2) ans[i][r]=1;
r++;
}
else{
l+=2;
if(l>r) r++;
}
}
}
int main(){
freopen("Heights.in","r",stdin);
freopen("Heights.out","w",stdout);
scanf("%d%d%d",&n,&k,&Q);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
maxn=max(maxn,a[i]);
}
solve(1);solve(2);
int l,r;
while(Q--){
scanf("%d%d",&l,&r);
if(ans[l][r]) puts("YES");
else puts("NO");
}
return 0;
}