链接:https://codeforces.com/contest/1272/problem/E
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn=2e5+10; int d[maxn],ans[maxn],a[maxn],aflag[maxn],n; vector<int>q[maxn]; void bfs(int flag) { memset(d,-1,sizeof(d)); queue<int>v; //1的话从奇数开始走 if(flag==1) { for(int i=1;i<=n;i++) { if(a[i]%2) { v.push(i); d[i]=0; } } } else{ for(int i=1;i<=n;i++) { if(a[i]%2==0) { v.push(i); d[i]=0; } } } while(!v.empty()) { int u=v.front(); v.pop(); for(int i=0;i<q[u].size();i++) { int to=q[u][i]; if(d[to]==-1) { v.push(to); d[to]=d[u]+1; } } } if(flag) { for(int i=1;i<=n;i++) { if(a[i]%2==0) ans[i]=d[i]; } } else{ for(int i=1;i<=n;i++) { if(a[i]%2==1) ans[i]=d[i]; } } } int main() { cin>>n; for(int i=1;i<=n;i++) { cin>>a[i]; } for(int i=1;i<=n;i++) { int l=i-a[i]; int r=i+a[i]; if(l>0) q[l].push_back(i); if(r<=n) q[r].push_back(i); } memset(ans,-1,sizeof(ans)); bfs(1); bfs(0); for(int i=1;i<=n;i++) cout<<ans[i]<<" "; return 0; }
原文:https://www.cnblogs.com/tombraider-shadow/p/12039941.html