codeforces 1272E(反向建边+多源bfs)

时间:2022-07-28
本文章向大家介绍codeforces 1272E(反向建边+多源bfs),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

题意描述

思路

AC代码

#include<bits/stdc++.h>
#define x first
#define y second
#define PB push_back
#define mst(x,a) memset(x,a,sizeof(x))
#define all(a) begin(a),end(a)
#define rep(x,l,u) for(ll x=l;x<u;x++)
#define rrep(x,l,u) for(ll x=l;x>=u;x--)
#define sz(x) x.size()
#define IOS ios::sync_with_stdio(false);cin.tie(0);
using namespace std;
typedef unsigned long long ull;
typedef pair<int,int> PII;
typedef pair<long,long> PLL;
typedef pair<char,char> PCC;
typedef long long ll;
const int N=2*1e5+10;
const int M=1e6+10;
const int INF=0x3f3f3f3f;
const int MOD=1e9+7;
int n,a[N],d[N];
vector<int> g[N];
struct node{
    int odd_d,even_d,u;
}Node[N];
void bfs(){
    queue<int> q;
    rep(i,1,n+1) q.push(i);
    while(q.size()){
        int t=q.front();q.pop();
        rep(i,0,sz(g[t])){
            int v=g[t][i];
            if(Node[t].u&1){
                if(Node[v].odd_d>1 || Node[v].even_d>Node[t].even_d+1){
                    Node[v].odd_d=1;
                    if(Node[v].even_d>Node[t].even_d+1) Node[v].even_d=Node[t].even_d+1;
                    q.push(v);
                }
            }else{
                if(Node[v].even_d>1 || Node[v].odd_d>Node[t].odd_d+1){
                    Node[v].even_d=1;
                    if(Node[v].odd_d>Node[t].odd_d+1) Node[v].odd_d=Node[t].odd_d+1;
                    q.push(v);
                }
            }
        }
    }
}
void solve(){
    cin>>n;
    rep(i,1,n+1){
        Node[i].odd_d=Node[i].even_d=INF;
        cin>>Node[i].u;
        if(i+Node[i].u<=n) g[i+Node[i].u].PB(i);
        if(i-Node[i].u>=1) g[i-Node[i].u].PB(i);
    }
    bfs();
    rep(i,1,n+1){
        if(Node[i].u&1) cout<<(Node[i].even_d==INF ? -1 : Node[i].even_d)<<' ';
        else cout<<(Node[i].odd_d==INF ? -1 : Node[i].odd_d)<<' ';
    }
    cout<<endl;
}
int main(){
    IOS;
    //freopen("test.in","r",stdin);
    //freopen("test.out","w",stdout);
    //int t;cin>>t;
    //while(t--)
        solve();
    return 0;
}