Submission #981418

#TimeUsernameProblemLanguageResultExecution timeMemory
981418Jawad_Akbar_JJRoad Closures (APIO21_roads)C++17
12 / 100
2028 ms12628 KiB
#include <iostream> #include <vector> #include <algorithm> // #include "roads.h" using namespace std; #define ll long long const int N = 1e5 + 10; vector<pair<int,int>> ch[N]; ll dp[N][2]; vector<ll> sub1(int n,vector<int> W){ sort(rbegin(W),rend(W)); vector<ll> v; v.push_back(0); for (int i : W) v[0] += i; for (int i : W) v.push_back(v.back() - i); return v; } vector<ll> sub2(int n,vector<int> W){ ll t = W[0]; ll nt = 0; vector<ll> v(n,0); v[0] += W[0]; for (int i=1;i<n-1;i++){ ll a = t; t = min(t,nt) + W[i]; nt = a; v[0] += W[i]; } v[1] = min(t,nt); return v; } void dfs(int u,int k,int p = -1,ll W = 1e12){ int d = ch[u].size(); vector<ll> Mn(d + 5,1e17); Mn[0] = 0; for (auto [i,w] : ch[u]){ if (i == p) continue; dfs(i,k,u,w); for (int j=d;j>=0;j--){ Mn[j + 1] = min(Mn[j + 1],Mn[j] + dp[i][1]); Mn[j + 1] = min(Mn[j + 1],Mn[j] + dp[i][0] + w); // cout<<u<<" link "<<i<<'\n'; Mn[j] += dp[i][0]; } } int to_rem = max(0,d - k); dp[u][0] = Mn[to_rem]; dp[u][1] = (to_rem != 0 ? Mn[to_rem - 1] : 0) + W; // cout<<"vertex "<<u<<" ::: \n"; // for (int i=0;i<d;i++) // cout<<i<<" "<<Mn[i]<<'\n'; // cout<<"dp values "<<dp[u][0]<<" "<<dp[u][1]<<endl; // cout<<'\n'; } vector<ll> sub3(int n,vector<int> U,vector<int> V,vector<int> W){ for (int i=0;i<n-1;i++){ ch[U[i] + 1].push_back({V[i] + 1,W[i]}); ch[V[i] + 1].push_back({U[i] + 1,W[i]}); } vector<ll> v; for (int k=0;k<n;k++){ for (int i=0;i<=n;i++) for (int j : {0,1}) dp[i][j] = 1e17; dfs(1,k); v.push_back(dp[1][0]); } return v; } vector<ll> minimum_closure_costs(int n,vector<int> U,vector<int> V,vector<int> W){ long long sum = 0,sum2 = 0,sum3 = 0; for (int i=0;i<n-1;i++) sum += U[i],sum2 += W[i],sum3 += (U[i] == i); if (sum == 0) return sub1(n,W); // if (sum2 == n-1) // return sub5(n,U,V); if (sum3 == n-1) return sub2(n,W); if (n <= 2000) return sub3(n,U,V,W); }

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:100:1: warning: control reaches end of non-void function [-Wreturn-type]
  100 | }
      | ^
#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...