結果
問題 | No.1868 Teleporting Cyanmond |
ユーザー |
![]() |
提出日時 | 2022-03-11 21:23:58 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 56 ms / 2,000 ms |
コード長 | 4,035 bytes |
コンパイル時間 | 2,347 ms |
コンパイル使用メモリ | 209,588 KB |
最終ジャッジ日時 | 2025-01-28 08:07:25 |
ジャッジサーバーID (参考情報) |
judge4 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 25 |
ソースコード
#include <bits/stdc++.h>using namespace std;using ll = long long;#define rep(i, n) for (int i = 0; i < n; i++)#define all(v) v.begin(), v.end()template <class T, class U>inline bool chmax(T &a, U b) {if (a < b) {a = b;return true;}return false;}template <class T, class U>inline bool chmin(T &a, U b) {if (a > b) {a = b;return true;}return false;}constexpr int INF = 1000000000;constexpr ll llINF = 3000000000000000000;constexpr int mod = 1000000007;const ll half = (mod + 1) / 2;constexpr double eps = 1e-10;vector<int> prime_list(int n) {vector<int> v(n + 1), res;for (int i = n; i >= 2; i--) {for (int j = i; j <= n; j += i) v[j] = i;}for (int i = 2; i <= n; i++) {if (v[i] == i) res.push_back(i);}return res;}vector<int> next_divisor(int n) {vector<int> v(n + 1);for (int i = n; i >= 2; i--) {for (int j = i; j <= n; j += i) v[j] = i;}return v;}ll modpow(ll a, ll b, ll m = mod) {ll res = 1;while (b) {if (b & 1) {res *= a;res %= m;}a *= a;a %= m;b >>= 1;}return res;}vector<ll> inv, fact, factinv;void init_fact(int n) {inv.resize(n + 1);fact.resize(n + 1);factinv.resize(n + 1);inv[0] = 0;inv[1] = 1;fact[0] = 1;factinv[0] = 1;for (ll i = 1; i <= n; i++) {if (i >= 2) inv[i] = mod - ((mod / i) * inv[mod % i] % mod);fact[i] = (fact[i - 1] * i) % mod;factinv[i] = factinv[i - 1] * inv[i] % mod;}}ll modinv(ll a, ll m = mod) {// gcd(a,m) must be 1ll b = m, u = 1, v = 0;while (b) {ll t = a / b;a -= t * b;swap(a, b);u -= t * v;swap(u, v);}u %= m;if (u < 0) u += m;return u;}ll comb(int a, int b) {if (a < b || a < 0 || b < 0) return 0;return fact[a] * factinv[a - b] % mod * factinv[b] % mod;}using S = pair<int, int>;S op(S a, S b) { return max(a, b); }S e() { return S{-1, 0}; }struct dual_segtree {int sz = 1, log = 0;vector<S> lz;dual_segtree(vector<S> a) {int n = a.size();while (sz < n) {sz <<= 1;log++;}lz.assign(sz << 1, e());for (int i = 0; i < n; i++) lz[i + sz] = a[i];}void push(int k) {int b = __builtin_ctz(k);for (int d = log; d > b; d--) {lz[k >> d << 1] = op(lz[k >> d << 1], lz[k >> d]);lz[k >> d << 1 | 1] = op(lz[k >> d << 1 | 1], lz[k >> d]);lz[k >> d] = e();}}void apply(int l, int r, S x) {l += sz, r += sz;push(l);push(r);while (l < r) {if (l & 1) {lz[l] = op(lz[l], x);l++;}if (r & 1) {r--;lz[r] = op(lz[r], x);}l >>= 1, r >>= 1;}}S get(int k) {k += sz;S res = e();while (k) {res = op(res, lz[k]);k >>= 1;}return res;}};void solve() {int n;cin >> n;vector<int> r(n - 1);rep(i, n - 1) {cin >> r[i];r[i]--;}vector<vector<pair<int, int>>> g(n);rep(i, n - 1) g[i + 1].push_back({i, 0});rep(i, n - 1) { g[i].push_back({r[i], 1}); }deque<int> deq;vector<int> d(n, INF);d[0] = 0;deq.push_back(0);while (!deq.empty()) {auto p = deq.front();deq.pop_front();for (auto [to, c] : g[p]) {if (c == 0) {if (chmin(d[to], d[p])) deq.push_front(to);} else {if (chmin(d[to], d[p] + 1)) deq.push_back(to);}}}cout << d[n - 1] << endl;}int main() {cin.tie(0);ios::sync_with_stdio(false);/*int t;cin >> t;while (t--)*/solve();}