示例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");
}
}