Submission #1197294

#TimeUsernameProblemLanguageResultExecution timeMemory
1197294hengliaoRoad Closures (APIO21_roads)C++20
24 / 100
2096 ms20912 KiB
#include "roads.h"
#include<bits/stdc++.h>
using namespace std;

#define F first
#define S second
#define pb push_back
#define vll vector<ll>
#define pll pair<ll, ll>

typedef long long ll;

const ll mxN=1e5+5;

vector<pll> adj[mxN];
ll n;
ll dp[mxN][2];
ll k;

void dfs(ll cur, ll par){
  ll dumb=0;
  vll tep;
  for(auto &[chd, w]:adj[cur]){
    if(chd==par) continue;
    dfs(chd, cur);
    dumb+=dp[chd][1];
    if(dp[chd][0]-dp[chd][1]+w>0) tep.pb(dp[chd][0]-dp[chd][1]+w);
  }
  sort(tep.begin(), tep.end(), greater<ll>());
  dp[cur][0]=dumb;
  for(ll i=0;i<k-1 && i<(ll) tep.size();i++){
    dp[cur][0]+=tep[i];
  }
  dp[cur][1]=dumb;
  for(ll i=0;i<k && i<(ll) tep.size();i++){
    dp[cur][1]+=tep[i];
  }
}

vector<long long> minimum_closure_costs(int N, vector<int> U,
                                             vector<int> V,
                                             vector<int> W) {
  n=N;
  ll sum=0;
  for(ll i=0;i<n-1;i++){
    adj[U[i]].pb({V[i], W[i]});
    adj[V[i]].pb({U[i], W[i]});
    sum+=W[i];
  }
  vll ans(n);
  for(ll i=0;i<n;i++){
    k=i;
    dfs(0, -1);
    ans[i]=sum-dp[0][1];
  }
  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...