穿梭时间的画面的钟 从反方向 开始移动|

tmjyh09

园龄:3年2个月粉丝:1关注:3

CF1579F Array Stabilization (AND version) 题解

题目传送门

分析

根据 and 操作的性质,只要有一个 0 存在,这个数记作 ai,那么 ai+d 就可以变成 0,然后 ai+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;
}

本文作者:tmjyh09

本文链接:https://www.cnblogs.com/tmjyh09/p/15943615.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   tmjyh09  阅读(23)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起