链接 E. Nearest Opposite Parity
题目
思路
正向建图,每个点跑一遍 b f s bfs bfs 会超时;
反向建图,然后找到一次就可以满足题意的点作为起始点,然后由起始点继续拓展即可;
AC代码
#include <iostream>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <map>
#include <vector>
#include <string>
#include <queue>
#define x first
#define y second
using namespace std;
const double eps = 1e-12;
const int N = 200010, P = 13331;
const int mod = 100003;
typedef pair<double, double> PDD;
typedef long long ll;
typedef unsigned long long ull;
const double pi = acos(-1);
int n;
int a[N];
int ans[N];
queue<int> q;
vector<int> v[N];
int main()
{
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
if (i - a[i] >= 1) v[i - a[i]].push_back(i);
if (i + a[i] <= n) v[i + a[i]].push_back(i);
}
for (int i = 1; i <= n; i++) {
if ((i - a[i] >= 1 && (a[i] & 1) ^ (a[i - a[i]] & 1)) || (i + a[i] <= n && (a[i] & 1) ^ (a[i + a[i]] & 1))) {
ans[i] = 1;
q.push(i);
}
}
while (q.size()) {
int t = q.front();
q.pop();
for (int i = 0; i < v[t].size(); i++) {
if (ans[v[t][i]] == 0) {
ans[v[t][i]] = ans[t] + 1;
q.push(v[t][i]);
}
}
}
for (int i = 1; i <= n; i++) {
if (ans[i]) cout << ans[i] << " \n"[i == n];
else cout << -1 << " \n"[i == n];
}
}