Submission #1223438

#TimeUsernameProblemLanguageResultExecution timeMemory
1223438KALARRYRoad Closures (APIO21_roads)C++20
0 / 100
2094 ms11800 KiB

#include <cassert>
#include <cstdio>

#include <vector>


#include <cassert>
#include <cstdio>

#include <vector>

#include<bits/stdc++.h>

using namespace std;

long long dp[100005][2]; //dp[v][0] = 0/1 -> connected with parent or not
vector<pair<long long,long long>> adj[100005];

void dfs(long long v,long long p,long long k)
{
    dp[v][0] = dp[v][1] = 0;
    vector<long long> diffs;
    for(auto e : adj[v])
    {
        long long u = e.first;
        long long w = e.second;
        if(u != p)
        {
            dfs(u,v,k);
            dp[v][0] += dp[u][0] + w;
            dp[v][1] += dp[u][0] + w;
            diffs.push_back({dp[u][1] - w - dp[u][0]});
        }
    }
    sort(diffs.begin(),diffs.end());
    long long L = diffs.size();
    for(long long j = 0 ; j < min(L,k) ; j++)
    {
        if(diffs[j] < 0)
        {
            dp[v][0] += diffs[j];
            if(j != k-1)
                dp[v][1] += diffs[j];
        }
    }

}

std::vector<long long> minimum_closure_costs(int N, std::vector<int> U,
    std::vector<int> V,
    std::vector<int> W) {
    for(long long i = 0 ; i < N ; i++)
    {
        U[i]++;
        V[i]++;
        adj[U[i]].push_back({V[i],W[i]});
        adj[V[i]].push_back({U[i],W[i]});
    }
    vector<long long> ret;
    int max_check = N-1;
    for(int i = 1 ; i <= N ; i++)
    {
        int L = adj[i].size();
        max_check = max(max_check,L);
    }
    for(long long k = 0 ; k <= max_check ; k++)
    {
        dfs(1,1,k);
        ret.push_back(dp[1][0]);
    }
    // for(int k = max_check+1 ; k < N ; k++)
    //     ret.push_back(0);
    for(int i = 1 ; i <= N ; i++)
        adj[i].clear();
    return ret;
}
#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...