想要快速查询,可以考虑先预处理。
经典滑动窗口。
自己的debug能力太弱了,基本靠对拍,这样吃枣药丸。
多总结下debug技巧,这能力真的很重要的。
#include<bits/stdc++.h>
#define maxn 100010
using namespace std;
int a[maxn];
int tong[maxn<<1];
int cnt[maxn];
int CNT;
int s,n;
int main()
{
//freopen("data.txt","r",stdin);
//freopen("wrong.txt","w",stdout);
int T;
scanf("%d",&T);
while(T--)
{
memset(tong,0,sizeof(tong));
memset(cnt,0,sizeof(cnt));
CNT=0;
scanf("%d %d",&s,&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1-s;i<=n;i++)
{
if(CNT==0) tong[i+s]=false;
else tong[i+s]=true;
if(i>=1&&i<=n)
{
cnt[a[i]]--;
if(cnt[a[i]]==1) CNT--;
}
int k=i+s;
if(k>=1&&k<=n)
{
cnt[a[k]]++;
if(cnt[a[k]]==2) CNT++;
}
}
int ans=0;
for(int i=1-s;i<=0;i++)
{
bool ok=true;
int k=i;
while(k<=n)
{
if(k>=1-s&&tong[k+s])
{
ok=false;
break;
}
k+=s;
}
if(ok) ans++;
}
printf("%d\n",ans);
}
return 0;
}