Codeforcesラウンド#605(本部3。)E - 最寄りの反対のパリティ

トピックリンク: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 
}

おすすめ

転載: www.cnblogs.com/myrtle/p/12040163.html