Submission #572015


Source Code Expand

#include <bits/stdc++.h>
using namespace std;
#define REP(i,n) for(int i=0;i<(int)(n);++i)
#define DEBUG(x) cerr << #x << " = " << x << endl
#define int long long
const int MAX_V = 100000;
const int INF = (int)1e9;
struct BIT {
  int N;
  vector<int> data;
  BIT(int n) : N(n), data(n + 1, 0) { }
  void add(int a, int w) {
    ++a;
    for(int x = a; x <= N; x += x & -x) {
      data[x] += w;
    }
  }
  int sum(int a) {
    int ret = 0;
    for(int x = a; x > 0; x -= x & -x) {
      ret += data[x];
    }
    return ret;
  }
};
struct Counter {
  const int N;
  BIT bit;
  Counter(int n) : N(n), bit(n) {}
  void insert(int x) {
    bit.add(x, 1);
  }
  void drop(int x) {
    bit.add(x, -1);
  }
  int geq(int i) {
    return bit.sum(N) - bit.sum(i);
  }
};
int N;
int L[MAX_V], P[MAX_V], D[MAX_V], M[MAX_V];
vector<int> child[MAX_V];
map<int, int> cmp;
map<int, int> ans;
void dfs(int v, Counter &counter) {
  for(int c : child[v]) counter.insert(cmp[M[c]]);
  auto it = cmp.upper_bound(D[v]);
  int geq = 0;
  if(it != cmp.end()) {
    geq = counter.geq(it->second);
  }
  if(!ans.count(D[v])) {
    ans[D[v]] = geq;
  }
  else {
    ans[D[v]] = min(ans[D[v]], geq);
  }
  for(int c : child[v]) {
    counter.drop(cmp[M[c]]);
    dfs(c, counter);
    counter.insert(cmp[M[c]]);
  }
  for(int c : child[v]) counter.drop(cmp[M[c]]);
}
signed main() {
  cin.tie(nullptr);
  ios::sync_with_stdio(false);
  cin >> N;
  REP(i,N) cin >> L[i];
  P[0] = -1;
  for(int i = 1; i < N; ++i) {
    cin >> P[i]; P[i]--;
    child[P[i]].push_back(i);
  }
  D[0] = L[0];
  for(int i = 1; i < N; ++i) {
    D[i] = D[P[i]] + L[i];
  }
  for(int i = N - 1; i >= 0; --i) {
    M[i] = D[i];
    for(int c : child[i]) {
      M[i] = max(M[i], M[c]);
    }
  }
  REP(i,N) cmp[M[i]] = -1;
  {
    int i = 0;
    for(auto &it : cmp) it.second = i++;
  }
  Counter counter(cmp.size());
  dfs(0, counter);
  int Q; cin >> Q;
  REP(q,Q) {
    int H; cin >> H;
    if(!ans.count(H)) cout << -1 << endl;
    else cout << ans[H] << endl;
  }
}

Submission Info

Submission Time
Task I - 風船ツリー
User arosh
Language C++11 (GCC 4.9.2)
Score 100
Code Size 2118 Byte
Status AC
Exec Time 706 ms
Memory 25412 KB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 100 / 100
Status
AC × 2
AC × 33
Set Name Test Cases
Sample sample-01.txt, sample-02.txt
All sample-01.txt, sample-02.txt, 01-01.txt, 01-02.txt, 01-03.txt, 01-04.txt, 01-05.txt, 01-06.txt, 01-07.txt, 01-08.txt, 01-09.txt, 01-10.txt, 01-11.txt, 01-12.txt, 01-13.txt, 01-14.txt, 01-15.txt, 01-16.txt, 01-17.txt, 01-18.txt, 01-19.txt, 01-20.txt, 01-21.txt, 01-22.txt, 01-23.txt, 01-24.txt, 01-25.txt, 01-26.txt, 01-27.txt, 01-28.txt, 01-29.txt, 01-30.txt, 01-31.txt
Case Name Status Exec Time Memory
01-01.txt AC 686 ms 14408 KB
01-02.txt AC 36 ms 3384 KB
01-03.txt AC 36 ms 3388 KB
01-04.txt AC 706 ms 14268 KB
01-05.txt AC 629 ms 13948 KB
01-06.txt AC 644 ms 14068 KB
01-07.txt AC 623 ms 13892 KB
01-08.txt AC 657 ms 14136 KB
01-09.txt AC 406 ms 14140 KB
01-10.txt AC 310 ms 7484 KB
01-11.txt AC 532 ms 8616 KB
01-12.txt AC 533 ms 8616 KB
01-13.txt AC 546 ms 25268 KB
01-14.txt AC 576 ms 25272 KB
01-15.txt AC 598 ms 25412 KB
01-16.txt AC 579 ms 18936 KB
01-17.txt AC 595 ms 19012 KB
01-18.txt AC 626 ms 22200 KB
01-19.txt AC 319 ms 8072 KB
01-20.txt AC 340 ms 8004 KB
01-21.txt AC 307 ms 7616 KB
01-22.txt AC 312 ms 7420 KB
01-23.txt AC 301 ms 7532 KB
01-24.txt AC 669 ms 13120 KB
01-25.txt AC 570 ms 11332 KB
01-26.txt AC 591 ms 10712 KB
01-27.txt AC 586 ms 9792 KB
01-28.txt AC 550 ms 9908 KB
01-29.txt AC 624 ms 15040 KB
01-30.txt AC 684 ms 14632 KB
01-31.txt AC 639 ms 14812 KB
sample-01.txt AC 37 ms 3440 KB
sample-02.txt AC 34 ms 3424 KB