Submission #1066672

#TimeUsernameProblemLanguageResultExecution timeMemory
1066672NeroZeinJobs (BOI24_jobs)C++17
11 / 100
168 ms38348 KiB
#include "bits/stdc++.h"
using namespace std;

#ifdef Nero
#include "Deb.h"
#else
#define debug(...)
#endif

const int N = 3e5 + 5;

int up[N];
int dep[N]; 
int a[N], p[N];
set<int> roots;
long long dp[N];
vector<int> g[N];
long long needed[N];

int get(int v) {
  return (v == 0 ? 0 : dp[v] <= 0 ? v : up[v] = get(up[v]));
}

void dfs(int v, long long sum) {
  sum += a[v];
  needed[v] = min(needed[v], sum);
  for (int u : g[v]) {
    dep[u] = dep[v] + 1;
    needed[u] = needed[v];
    dfs(u, sum); 
  }
}

void activate(int v) {
  dp[v] += a[v];
  //debug(v);
  while (true) {
    //debug(v, dp[v]);
    if (v == 0 || dp[v] <= 0) {
      //cout << '\n';
      return;
    }
    if (p[v] == 0 && dp[v] > 0) {
      roots.insert(v); 
    }
    int nv = get(v); 
    dp[nv] += dp[v];
    v = nv; 
  }
  //cout << '\n';
}

void dfs2(int v, long long& s) {
  s += a[v];
  for (int u : g[v]) {
    if (dp[u] > 0) {
      dfs2(u, s);
    } else {
      p[u] = 0;//new root. 
    }
  }
}

int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  int n;
  long long s;
  cin >> n >> s;
  for (int i = 1; i <= n; ++i) {
    cin >> a[i] >> p[i];
    g[p[i]].push_back(i);
  }
  for (int i = 1; i <= n; ++i) {
    up[i] = p[i];
    if (p[i] == 0) {
      dfs(i, 0); 
    }
  }
  vector<int> ord(n);
  iota(ord.begin(), ord.end(), 1);
  sort(ord.begin(), ord.end(), [&](int i, int j) {
    return (needed[i] == needed[j] ? dep[i] > dep[j] : needed[i] < needed[j]);
  });
  long long curr = s; 
  while (true) {
    while (!ord.empty() && -needed[ord.back()] <= curr) {
      int v = ord.back();
      ord.pop_back();
      activate(v);
    }
    if (roots.empty()) {
      break;
    }
    //debug(roots);
    while (!roots.empty()) {
      int v = *roots.begin();
      roots.erase(v);
      dfs2(v, curr); 
    }
  }
  cout << curr - s << '\n'; 
  return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...