Submission #1022031

#TimeUsernameProblemLanguageResultExecution timeMemory
1022031huutuanJobs (BOI24_jobs)C++14
54 / 100
2089 ms38484 KiB
#pragma GCC optimize("Ofast,unroll-loops")
#pragma GCC target("avx2")
#include<bits/stdc++.h>

using namespace std;

// #define int long long
using ll=long long;

const int N=3e5+10;
int n, p[N];
ll s, a[N];
ll f[N], pf[N];
vector<int> g[N];
// vector<int> tr;

void dfs(int u, ll sum){
   sum+=a[u];
   pf[u]=min(pf[p[u]], sum);
   for (int v:g[u]) dfs(v, sum);
   f[u]=(s+pf[u]<0?0:a[u]);
   for (int v:g[u]) f[u]+=f[v];
   f[u]=max(0ll, f[u]);
}

void trace(int u){
   if (s+pf[u]<0){
      // tr.push_back(u);
      return;
   }
   ll sum=a[u];
   for (int v:g[u]) sum+=f[v];
   if (f[u]==sum){
      a[u]=0;
      for (int v:g[u]) trace(v);
   }// else tr.push_back(u);
}

int32_t main(){
   ios_base::sync_with_stdio(false);
   cin.tie(nullptr);
   cin >> n >> s;
   for (int i=1; i<=n; ++i){
      cin >> a[i] >> p[i];
      g[p[i]].push_back(i);
   }
   ll ans=0;
   for (int i=1; i<=n; ++i){
      dfs(0, 0);
      ans+=f[0];
      s+=f[0];
      trace(0);
      if (!f[0]) break;
      // g[0].swap(tr);
      // tr.clear();
   }
   cout << ans << '\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...