[CF1272E] la plus proche de la parité face - Shortest

Une longueur donnée de \ (n \) séquence \ (A \) , lors de la première \ (I \) position de nombre, on peut intervenir à l' écoute \ (i-a_i \) et \ (i + a i \ ) , à condition que \ (1 \ le \) pour accéder à l'emplacement \ (\ n-le \) , pour chaque position \ (i \) , vous voulez connaître le nombre minimum d'étapes nécessaires pour atteindre une position \ (J \) , de telle sorte que \ (a_j \) et \ (a_i \) de parité différente

Solution

Le premier \ (i-a_i \) points, le \ (i + a i \) pointe vers le deuxième \ (I \) points de côtés reliés, le coût \ (1 \) , tous les points impairs à la \ (n + 1 \) côtés même, le coût \ (0 \) , à tous les points , même \ (n + 2 \) bord relié, le coût \ (0 \)

Respectivement \ (n + 1. \) \ (N-2 + \) commençant à courir le plus court

#include <bits/stdc++.h>
using namespace std;
#define reset(x) memset(x,0,sizeof x)
#define reset3f(x) memset(x,0x3f,sizeof x)
namespace sp {
const int N=1e+6+5;
vector<pair<int,int> > g[N];
int n,v0=1,d[N],v[N];
void make(int t1,int t2,int t3) {
    g[t1].push_back(make_pair(t2,t3));
}
void reset_graph() {
    for(int i=0;i<=n;i++) g[i].clear();
}
void solve() {
    queue <int> qu;
    reset(v); reset3f(d);
    d[v0]=0; v[v0]=1; qu.push(v0);
    while(qu.size()) {
        int p=qu.front();
        qu.pop();
        v[p]=0;
        for(int i=0;i<g[p].size();i++) {
            int q=g[p][i].first,w=g[p][i].second;
            if(d[q]>d[p]+w) {
                d[q]=d[p]+w;
                if(!v[q]) qu.push(q), v[q]=1;
            }
        }
    }
}
}

int n,a[200005],ans[200005];

signed main() {
    ios::sync_with_stdio(false);
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];
    for(int i=1;i<=n;i++) {
        if(i+a[i]<=n) sp::make(i+a[i],i,1);
        if(i-a[i]>=1) sp::make(i-a[i],i,1);
        if(a[i]&1) sp::make(n+1,i,0);
        else sp::make(n+2,i,0);
    }
    sp::v0=n+1;
    sp::solve();
    for(int i=1;i<=n;i++) if(a[i]%2==0) ans[i]=sp::d[i];
    sp::v0=n+2;
    sp::solve();
    for(int i=1;i<=n;i++) if(a[i]%2) ans[i]=sp::d[i];
    for(int i=1;i<=n;i++) {
        if(ans[i]>=1e9) cout<<-1<<" ";
        else cout<<ans[i]<<" ";
    }
}

Je suppose que tu aimes

Origine www.cnblogs.com/mollnn/p/12563830.html
conseillé
Classement