This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "roads.h"
#include<bits/stdc++.h>
using namespace std;
#define pb push_back
#define fi first
#define se second
#define sz(a) (int)(a.size())
#define all(a) a.begin(),a.end()
#define lb lower_bound
#define ub upper_bound
#define owo ios_base::sync_with_stdio(0);cin.tie(0);
#define INF (ll)(1e18)
#define debug(...) fprintf(stderr, __VA_ARGS__),fflush(stderr)
#define time__(d) for(long blockTime = 0; (blockTime == 0 ? (blockTime=clock()) != 0 : false);\
debug("%s time : %.4fs\n", d, (double)(clock() - blockTime) / CLOCKS_PER_SEC))
typedef long long int ll;
typedef long double ld;
typedef pair<ll,ll> PII;
typedef pair<int,int> pii;
typedef vector<vector<int>> vii;
typedef vector<vector<ll>> VII;
ll gcd(ll a,ll b){if(!b)return a;else return gcd(b,a%b);}
vector<vector<PII>> adj(200005);
ll dp[2][2001];
void dfs(int v,int u,int k,ll w){
int need = sz(adj[v])-k;
need = max(need,0);
vector<PII>choose;
vector<ll>rest;
for(PII z:adj[v]){
int x = z.fi;
ll w = z.se;
if(x != u){
dfs(x,v,k,w);
if(dp[0][x] == INF){
dp[0][v]+=dp[1][x];
dp[1][v]+=dp[1][x];
need--;
}
else choose.pb({dp[1][x]-min(dp[1][x],dp[0][x]),x});
}
}
sort(all(choose));
if(need <= sz(choose)){
for(int i=0;i<need;i++)dp[0][v]+=dp[1][choose[i].se];
for(int i=need;i<sz(choose);i++)dp[0][v]+=min(dp[0][choose[i].se],dp[1][choose[i].se]);
}
else dp[0][v] = INF;
if(u != -1){
dp[1][v] += w;
need = max(0,need-1);
rest.clear();
for(int i=0;i<need;i++)dp[1][v]+=dp[1][choose[i].se];
for(int i=need;i<sz(choose);i++)dp[1][v]+=min(dp[0][choose[i].se],dp[1][choose[i].se]);
}
}
vector<ll>ans;
vector<ll> minimum_closure_costs(int n, vector<int> u,vector<int>v,vector<int>w){
bool sub1 =1;
bool sub2 = 1;
bool sub4 = 1;
ans.resize(n);
for(int i=0;i<n-1;i++){
ans[0]+=w[i];
if(u[i] != i || v[i] != i+1)sub2 = 0;
if(u[i])sub1 = 0;
adj[u[i]].pb({v[i],w[i]});
adj[v[i]].pb({u[i],w[i]});
}
if(sub1){
sort(all(w));
ll sum = 0;
for(int i=0;i<n-1;i++){
sum+=w[i];
ans[n-i-2] = sum;
}
return ans;
}
if(sub2){
VII d(2,vector<ll>(n,INF));
d[0][0] = 0;
d[1][0] = w[0];
for(int i=1;i<n-1;i++){
d[0][i] = d[1][i-1];
d[1][i] = min(d[0][i-1],d[1][i-1])+w[i];
}
ans[1] = min(d[0][n-2],d[1][n-2]);
return ans;
}
for(int i=0;i<n;i++){
for(int i=0;i<n;i++)dp[0][i] = dp[1][i] = 0;
dfs(0,-1,i,0);
//if(i==1)for(int j=0;j<n;j++)cout<<dp[0][j]<<" "<<dp[1][j]<<'\n';
ans[i] = dp[0][0];
}
return ans;
}
Compilation message (stderr)
roads.cpp: In function 'std::vector<long long int> minimum_closure_costs(int, std::vector<int>, std::vector<int>, std::vector<int>)':
roads.cpp:62:7: warning: unused variable 'sub4' [-Wunused-variable]
62 | bool sub4 = 1;
| ^~~~| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |