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;
}
posted @ 2022-02-27 21:56  tmjyh09  阅读(19)  评论(0编辑  收藏  举报