Solution
按照 (p[i]) 进行分段,如果某个 (k) 不存在 (p[i]=k),那么就把 (i,i+1) 分割开
处理出每一段的左端点和右端点
进而处理出每段的最小值和最大值
如果存在第 (i) 段的最大值大于第 (i+1) 段的最小值,就输出 NO
#include <bits/stdc++.h>
using namespace std;
#define reset(x) memset(x,0,sizeof x)
const int N = 1005;
int T,n,m,a[N],p[N],b[N],l[N],r[N],mx[N],mn[N];
signed main() {
cin>>T;
while(T--) {
reset(a); reset(p); reset(b);
reset(r); reset(l);
reset(mx); reset(mn);
cin>>n>>m;
for(int i=1;i<=n;i++) {
cin>>a[i];
}
for(int i=1;i<=m;i++) {
cin>>p[i];
b[p[i]]=1;
}
int ind=1;
l[1]=1;
for(int i=1;i<=n;i++) {
if(b[i]==0) r[ind]=i, l[++ind]=i+1;
}
--ind;
for(int i=1;i<=ind;i++) {
mx[i]=0; mn[i]=1e9;
for(int j=l[i];j<=r[i];j++) {
mx[i]=max(mx[i],a[j]);
mn[i]=min(mn[i],a[j]);
}
}
int flag=1;
for(int i=1;i<ind;i++) {
if(mx[i]>mn[i+1]) flag=0;
}
if(flag) puts("YES");
else puts("NO");
}
}