제출 #1364958

#제출 시각아이디문제언어결과실행 시간메모리
1364958julia_08Petrol stations (CEOI24_stations)C++20
0 / 100
29 ms12364 KiB
#include <bits/stdc++.h>
using namespace std;

using ll = long long;

const int MAXN = 7e4 + 10;

int ans[MAXN], cost[MAXN];

ll sum[MAXN];

vector<pair<int, int>> adj[MAXN];

int k;

void dfs(int v, int p, vector<pair<int, int>> &line){

  for(auto [u, w] : adj[v]){
    if(u != p){

      line.push_back({u, w});
      dfs(u, v, line);

    }
  }

}

void solve(vector<pair<int, int>> vtx){

  int n = (int) vtx.size();

  sum[0] = 0;

  for(int i=1; i<n; i++) sum[i] = sum[i - 1] + vtx[i].second;

  for(int i=0; i<n; i++) cost[i] = 1;

  for(int i=0; i<n; i++){

    int l = i, r = n - 1;

    while(l < r){

      int m = l + (r - l + 1) / 2;

      if(sum[m] - sum[i] <= k) l = m;
      else r = m - 1;

    }

    ans[vtx[l].first] += cost[i] * (n - l - 1);
    cost[l] += cost[i];

  }

}

int main(){
  cin.tie(0)->sync_with_stdio(0);

  int n; cin >> n >> k;

  for(int i=1; i<n; i++){

    int a, b, l; cin >> a >> b >> l;

    a ++; b ++;

    adj[a].push_back({b, l});
    adj[b].push_back({a, l});

  }

  vector<pair<int, int>> line = {{1, 0}};

  dfs(1, 0, line);

  solve(line);

  reverse(line.begin(), line.end());

  for(int i=(n - 1); i>=0; i--) line[i].second = line[i - 1].second;

  line[0].second = 0;

  solve(line);

  for(int i=1; i<=n; i++) cout << ans[i] << "\n";

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