Submission #1365617

#TimeUsernameProblemLanguageResultExecution timeMemory
1365617settopRoad Closures (APIO21_roads)C++20
31 / 100
2094 ms24628 KiB
#include "roads.h"
#include<bits/stdc++.h>
using namespace std;

#define ll long long
#define fall(i,a,b) for(int i=a;i<=b;i++)
#define rfall(i,a,b) for(int i=a;i>=b;i--)
#define pb push_back
#define all(x) x.begin(),x.end()
#define sz(x) (int)x.size()
typedef pair<int,int> pii;
const int MAXN=1e5+10;
const ll inf=1e17;

int n;
ll dp[MAXN][2];
vector<pii> g[MAXN];

void dfs(int x,int pr,int val,int peso){
  vector<int> gaps;
  int quan=sz(g[x]);
  dp[x][0]=dp[x][1]=0;
  for(auto [u,w]:g[x]) if(u!=pr){
    dfs(u,x,val,w);
    if(dp[u][1]<=dp[u][0]){
      quan--;
      dp[x][0]+=dp[u][1];
    }
    else{
      dp[x][0]+=dp[u][0];
      gaps.pb(dp[u][1]-dp[u][0]);
    }
  }
  sort(all(gaps));
  dp[x][1]=dp[x][0];
  for(auto u:gaps){
    if(quan>val+1) dp[x][1]+=u;
    if(quan>val){
      dp[x][0]+=u;
      quan--;
    }
  }
  if(quan>val) dp[x][0]=inf;
  dp[x][1]+=peso;
}

std::vector<long long> minimum_closure_costs(int N, std::vector<int> U,std::vector<int> V,std::vector<int> W){
  n=N;
  fall(i,0,N-2) g[U[i]].pb({V[i],W[i]}),g[V[i]].pb({U[i],W[i]});
  int mx=0;
  fall(i,0,N-1) mx=max(mx,sz(g[i]));
  vector<ll> ans(n);
  fall(i,0,mx){
    dfs(0,-1,i,-1);
    ans[i]=dp[0][0];
  }
  return ans;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...