제출 #859649

#제출 시각아이디문제언어결과실행 시간메모리
859649boris_mihov도로 폐쇄 (APIO21_roads)C++17
0 / 100
21 ms5212 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][MAXN][2]; llong dp[MAXN][MAXN][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); 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]}); } firstDFS(1, 0); std::vector <llong> ans(n); for (int i = 0 ; i < n ; ++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)); assert(f(i, k, true) - f(i, k + 1, false) <= f(i, k + 1, true) - f(i, k + 2, false)); } } return ans; }
#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...