제출 #1336191

#제출 시각아이디문제언어결과실행 시간메모리
1336191vehamRoad Closures (APIO21_roads)C++20
24 / 100
2095 ms22680 KiB
#include "roads.h"
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef vector<ll> vl;
typedef pair<int,ll> pil;
typedef vector<pil> vpil;
typedef vector<vpil> vvpil;
struct tree{
  int N;
  vvpil C;
  vi F;
  vl FW, dp1, dp2;

  void dfs(int v = 0, int prev = -1){
    if(prev != -1){
      for(int i = 0;i < C[v].size();i++){
        if(C[v][i].first == prev){
          C[v].erase(C[v].begin() + i);
          break;
        }
      }
    }
    for(auto [u,w] : C[v]){
      F[u] = v;
      FW[u] = w;
      dfs(u,v);
    }
  }

  tree(int N, vi U, vi V, vi W) : N(N) {
    C.assign(N,{});
    for(int i = 0;i < N-1;i++) C[U[i]].emplace_back(V[i],W[i]), C[V[i]].emplace_back(U[i],W[i]);
    F.assign(N,0);
    FW.assign(N,0);
    dp1 = dp2 = FW;
    dfs();
  }

  void test(int k, int v = 0) {
    ll base = 0;
    vl imp;
    for(auto [u,w] : C[v]){
      test(k,u);
      base += dp1[u];
      imp.push_back(dp2[u] - dp1[u]);
    }
    sort(imp.begin(),imp.end());
    dp1[v] = dp2[v] = base;
    for(int i = 0;i < min(k,(int)imp.size()) && imp[i] < 0;i++) dp1[v] += imp[i];
    dp1[v] += FW[v];
    for(int i = 0;i < min(k-1,(int)imp.size()) && imp[i] < 0;i++) dp2[v] += imp[i];
    dp2[v] = min(dp2[v],dp1[v]);
  }
};

vl minimum_closure_costs(int N, vi U, vi V, vi W) {
  tree T(N,U,V,W);
  vl Ans(N,0);
  for(int k = 0;k < N;k++){
    T.test(k);
    Ans[k] = T.dp2[0];
  }
  return Ans;
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...