[CF1311B] WeirdSort

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");
    }
}
原文地址:https://www.cnblogs.com/mollnn/p/12372857.html