金魚亭日常

読書,ガジェット,競技プログラミング

ABC#026 C - 高橋君の給料

#chokudai今日の一問 2日目は,

ABC#026 C - 高橋君の給料

C - 高橋君の給料

自分より数字の大きい上司はいないので,後ろから順番に給料を決めていく.

二次元vector の初期化のうまいやり方がわからんかった.

#include <algorithm>
#include <cmath>
#include <cstdio>
#include <iomanip>
#include <iostream>
#include <map>
#include <queue>
#include <sstream>
#include <string>

using namespace std;

static int N;
static vector<vector<int>> B;

void solve() {
  vector<long long> v(N + 1, 1);
  for (int i = N; i > 0; i--) {
    vector<int> x;
    for (int b = 1; b < B[i].size(); b++) {
      x.push_back(v[B[i][b]]);
    }
    if (x.empty()) {
      v[i] = 1;
    } else {
      v[i] = *max_element(x.begin(), x.end()) +
             *min_element(x.begin(), x.end()) + 1;
    }
  }
  printf("%lld\n", v[1]);
}

int main() {
  cin >> N;
  B.resize(N + 1);
  for (int i = 0; i < N + 1; i++) {
    vector<int> v(1);
    B[i] = v;
  }
  for (int i = 0; i < N - 1; i++) {
    int b;
    cin >> b;
    B[b].push_back(i + 2);
  }
  solve();
  return 0;
}

https://atcoder.jp/contests/abc026/submissions/7089830