제출 #1355144

#제출 시각아이디문제언어결과실행 시간메모리
1355144edoTrains (BOI24_trains)C++20
0 / 100
12 ms7820 KiB
#include <bits/stdc++.h>

using namespace std;
using ll = long long;

int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);

  int n;
  ll s;
  cin >> n >> s;
  vector<ll> p(n + 1), w(n + 1);
  vector<vector<int>> g(n + 1);
  for (int i = 1; i <= n; ++i) {
    cin >> w[i] >> p[i];
    g[p[i]].push_back(i);
  }

  struct cmp {
    bool operator()(const pair<ll, ll> &a, const pair<ll, ll> &b) const {
      if (a.first != b.first)
        return a.first > b.first;
      return a.second > b.second;
    }
  };

  vector<multiset<pair<ll, ll>, cmp>> gr(n + 1);
  for (int i = n; ~i; --i) {
    for (int j : g[i]) {
      if (gr[i].size() < gr[j].size())
        swap(gr[i], gr[j]);
      gr[i].insert(gr[j].begin(), gr[j].end());
      gr[j].clear();
    }

    ll sum = w[i], mn = min(0ll, w[i]);
    while (gr[i].size()) {
      auto it = gr[i].begin();
      auto [cmn, csum] = *it;
      if (sum > 0 && mn > cmn)
        break;

      gr[i].erase(it);
      mn = min(mn, sum + cmn);
      sum += csum;
    }
    if (sum > 0) {
      gr[i].insert({mn, sum});
    }
  }

  ll ans = 0;
  for (auto [mn, sum] : gr[0]) {
    if (s + ans + mn < 0)
      break;
    ans += sum;
  }

  cout << ans;
  return 0;
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…