トピックリンク:http://codeforces.com/contest/1272/problem/E
問題の意味:与えられたN、所与の数N [i]は、各番号の出力D [i]を。
各iについて、iを移動させることができる+ [I]及びIA [I](IF I + [I] <= N、IA [I]> = 1)
D [i]はiからjまでの移動ステップ数はいずれかである、条件[i]と異なるパリティのA [j]を満たす必要があります
かかわらず、隣接テーブルのベクトルに第1のパリティ、接続されたエッジの
IとI + [i]は異なるパリティは、その後、ANS [i]には1、キュー私にキューである場合
同様に、IおよびIA [i]は異なるパリティは、その後、ANS [i]が1、キューにある場合、キューI
(BFS)
キューキューそれが答えを持っている各ポイントに格納され、1にすべての点でキューを開始したANS。
異なるパリティ付きニーズ[i]と[J]に、唯一のパリティは今同じ答えにポイントを持っている必要が。
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 const int型 MAXN = 2E5 + 10 。 ベクター < INT > V [MAXN]。 INT ANS [MAXN]、[MAXN]。 INT メイン() { memsetの(ANS、 - 1、はsizeof ANS)。 int型のn; scanf関数(" %のD "、&N) 以下のために(INT iが= 1 ; I <= N; I ++)CIN >> [I]。 キュー < 整数 > Q; 以下のための(INT iは= 1 ; iが<= N; I ++ ) { int型 J = + [I]。 もし(j <= N) { V [J] .push_back(I)。 もし([J]%2!= [I]%2 ) { ANS [I] = 1 。 q.push(I); } } J = I- A [i]は、 もし(J> = 1 ) { V [J] .push_back(I)。 もし([J]%2!= [I]%2) { ANS [I] = 1 。 q.push(I); } } } ながら(q.empty()!)// BFS { INT CUR = q.front()。 q.pop(); 用(INT N:V [CUR]) { 場合(ANS [N] == - 1 && [N]%2 == [CUR]%2 ) { ANS [N] = ANS [CUR] + 1 。 q.push(N) } } } 以下のために(INT iが= 1 ; I <= N; I ++ ) { COUT << ANS [I] << " " 。 } 戻り 0 。 }