Submission #1200032

#TimeUsernameProblemLanguageResultExecution timeMemory
1200032ackhavaRoad Closures (APIO21_roads)C++20
14 / 100
2097 ms90900 KiB
#include "roads.h"
#include <bits/stdc++.h>
#define REP(i,o,n) for(long long i=o;i<n;i++)
#define fi first
#define se second
#define pb push_back
using namespace std;

vector<pair<long long,long long>> adj[200100];
vector<pair<long long,long long>> child[200100];
long long sz[200100];
long long memo[2010][2010][2];

void dfs(long long node, long long parent=-1){
  sz[node]=1;
  for(auto i:adj[node]){
    if(i.fi!=parent)dfs(i.fi,node),sz[node]+=sz[i.fi],child[node].pb(i);
  }
}

long long dp(long long node, long long k, bool lim){
  auto &ans=memo[node][k][lim];
  if(ans!=-1)return ans;
  ans=0;
  long long con=k;
  if(lim)con--;
  con=max(con,0LL);
  vector<long long> upgrades;
  for(auto i:child[node]){
    ans+=dp(i.fi,k,false)+i.se;
    upgrades.pb(dp(i.fi,k,true) - (dp(i.fi,k,false)+i.se));
  }
  sort(upgrades.begin(),upgrades.end());
  REP(i,0,con){
    if(upgrades.size()>i && upgrades[i]<0)ans+=upgrades[i];
  }
  return ans;
}

std::vector<long long> minimum_closure_costs(signed N, std::vector<signed> U,
                                             std::vector<signed> V,
                                             std::vector<signed> W) {
  memset(sz,-1,sizeof sz);
  REP(i,0,N)adj[i].clear();
  REP(i,0,N-1){
    adj[U[i]].pb({V[i],W[i]});
    adj[V[i]].pb({U[i],W[i]});
  }
  dfs(0);
  memset(memo,-1,sizeof memo);
  vector<long long> vec;
  REP(i,0,N)vec.pb(dp(0,i,false));
  return vec;
}
#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...