牛客(多校6): K-Bag

在这里插入图片描述
示例1:
输入

1
8 3
2 3 2 1 3 3 2 1

输出

YES

题意
K-bag序列定义为由多个1-k的排列顺序连接起来的序列,想问给定序列是不是k-bag的连续子序列

代码:

#include <bits/stdc++.h>
const int N=5e5+10;
using namespace std;
int T,n,k,a[N],b[N],cnt,pre[N],len[N];
int main(){
    scanf("%d",&T);
    while(T--){
        memset(pre,0,sizeof(pre));
        scanf("%d%d",&n,&k);
        for(int i=1;i<=n;i++) scanf("%d",a+i),b[i]=a[i];
        sort(b+1,b+n+1);
        cnt=unique(b+1,b+n+1)-b-1;
        for(int i=1;i<=n;i++) a[i]=lower_bound(b+1,b+cnt+1,a[i])-b;
        int p=1,t=0;
        for(int i=1;i<=n;i++){
            while(!pre[a[p]]&&p<=n) ++pre[a[p]],++p;
            --pre[a[i]],len[i]=p-i;
        }for(int st=1;st<=min(k,len[1]+1);st++){
            bool f=1;
            for(int i=st;i<=n;i+=k){
                if(i+len[i]>=n+1) continue;
                else if(len[i]^k){f=0;break;}
            }if(f){t=1;break;}
        }printf(t?"YES\n":"NO\n");
    }
}

猜你喜欢

转载自blog.csdn.net/qq_46144237/article/details/107666148