Submission #859661

#TimeUsernameProblemLanguageResultExecution timeMemory
859661boris_mihovRoad Closures (APIO21_roads)C++17
0 / 100
20 ms5288 KiB
#include "roads.h" #include <algorithm> #include <iostream> #include <numeric> #include <cassert> #include <vector> typedef long long llong; const int MAXN = 2000 + 10; const llong INF = 1e18; const int INTINF = 1e9; int n; std::vector <std::pair <int,int>> g[MAXN]; bool bl[MAXN][2][2]; llong dp[MAXN][2][2]; void firstDFS(int node, int par) { for (auto &curr : g[node]) { if (curr.first == par) { std::swap(curr, g[node].back()); g[node].pop_back(); break; } } for (const auto &[u, w] : g[node]) { firstDFS(u, node); } } llong f(int node, int k, bool k2) { // if (k == 1) std::cout << "call: " << node << ' ' << g[node].size() << ' ' << k << '\n'; if (g[node].empty()) { return 0; } if (bl[node][k][k2]) { return dp[node][k][k2]; } bl[node][k][k2] = true; std::vector <std::pair <llong,int>> vals; for (const auto &[u, w] : g[node]) { dp[node][k][k2] += w + f(u, k + k2, false); vals.push_back({f(u, k + k2 - 1, true) - (w + f(u, k + k2, false)), u}); } std::sort(vals.begin(), vals.end()); for (int i = 0 ; i < std::min((int)vals.size(), k) ; ++i) { if (vals[i].first >= 0) break; dp[node][k][k2] += vals[i].first; } return dp[node][k][k2]; } std::vector <llong> minimum_closure_costs(int N, std::vector <int> U, std::vector <int> V, std::vector <int> W) { n = N; for (int i = 0 ; i < n - 1 ; ++i) { g[U[i] + 1].push_back({V[i] + 1, W[i]}); g[V[i] + 1].push_back({U[i] + 1, W[i]}); } std::sort(W.begin(), W.end(), std::greater <int> ()); std::vector <llong> ans(n, 0); llong sum = 0; for (int i = n - 1 ; i >= 0 ; --i) { if (W.size() > i) { sum += W.back(); W.pop_back(); } ans[i] = sum; } return ans; firstDFS(1, 0); int cnt = 0; for (int i = 0 ; i <= 1 ; ++i) { ans[i] = f(1, i, false); } // for (int i = 1 ; i <= n ; ++i) // { // for (int k = 0 ; k + 1 < n ; ++k) // { // assert(f(i, k, false) - f(i, k + 1, false) >= f(i, k + 1, false) - f(i, k + 2, false)); // assert(f(i, k, true) - f(i, k + 1, true) >= f(i, k + 1, true) - f(i, k + 2, true)); // } // } 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:82:22: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   82 |         if (W.size() > i)
      |             ~~~~~~~~~^~~
roads.cpp:93:9: warning: unused variable 'cnt' [-Wunused-variable]
   93 |     int cnt = 0;
      |         ^~~
#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...