CF1579F Array Stabilization (AND version) 题解
分析
根据 \(\operatorname{and}\) 操作的性质,只要有一个 \(0\) 存在,这个数记作 \(a_i\),那么 \(a_{i+d}\) 就可以变成 \(0\),然后 \(a_{i+d}\) 又可以继续更新下一个数为 \(0\),所以直接 bfs 解决即可。
最终的答案即为 bfs 的次数。注意,由于无论如何都会入队一次,最终答案需要减一。
代码实现
#include <bits/stdc++.h>
using namespace std;
inline int read(){
int x=0,f=0;char ch=getchar();
while(!isdigit(ch))f^=!(ch^45),ch=getchar();
while(isdigit(ch))x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
return f?-x:x;
}
inline void write(int x){
if(x<0)x=-x,putchar('-');
if(x>=10)write(x/10);
putchar(x%10+'0');
}
inline void writeln(int x){write(x);puts("");}
int n,d;
int a[1000005];
int main(){
int T=read();
while(T--){
n=read(),d=read();
for(int i=0;i<n;i++)a[i]=read();
queue <int> q;
for(int i=0;i<n;i++)if(!a[i])q.push(i);
int ans=0;
while(!q.empty()){
int len=q.size();
for(int i=0;i<len;i++){
int u=q.front();q.pop();
int v=(u+d)%n;
if(a[v]){
q.push(v);a[v]=0;
}
}
ans++;
}
for(int i=0;i<n;i++)if(a[i])ans=-1;
writeln(ans==-1?ans:ans-1);
}
#ifndef ONLINE_JUDGE
system("pause");
#endif
return 0;
}