제출 #1170646

#제출 시각아이디문제언어결과실행 시간메모리
1170646anmattroi봉쇄 시간 (IOI23_closing)C++17
51 / 100
49 ms17220 KiB
#include "closing.h" #include <bits/stdc++.h> #define maxn 200005 #define fi first #define se second using namespace std; using ii = pair<int, int>; int n, x, y; int64_t k; int64_t dp[2005][4005]; int64_t disX[2005], disY[2005]; int64_t cost_level_one[2005], cost_level_two[2005]; vector<ii> adj[2005]; void calcdisX() { function<void(int, int)> dfs = [&](int u, int dad) { for (auto [v, l] : adj[u]) if (v != dad) { disX[v] = disX[u] + l; dfs(v, u); } }; disX[x] = 0; dfs(x, -1); } void calcdisY() { function<void(int, int)> dfs = [&](int u, int dad) { for (auto [v, l] : adj[u]) if (v != dad) { disY[v] = disY[u] + l; dfs(v, u); } }; disY[y] = 0; dfs(y, -1); } int sub1() { vector<int64_t> nho; for (int i = 0; i < n; i++) nho.emplace_back(min(disX[i], disY[i])); sort(nho.begin(), nho.end()); int64_t ans = 0; for (int i = 0; i < n; i++) { ans += nho[i]; if (ans > k) return i; } return n; } int sub2() { for (int i = 0; i < n; i++) { cost_level_two[i] = max(disX[i], disY[i]); cost_level_one[i] = min(disX[i], disY[i]); } int64_t sum = 0; int cnt = 0; for (int i = 0; i < n; i++) if (disX[i] + disY[i] == disX[y]) { sum += cost_level_one[i]; ++cnt; } for (int i = 0; i <= 2*n; i++) dp[n][i] = LLONG_MAX/2; dp[n][cnt] = sum; for (int i = n-1; i >= 0; i--) { for (int j = 0; j <= 2*n; j++) dp[i][j] = dp[i+1][j]; if (disX[i] + disY[i] == disX[y]) { for (int j = 0; j <= 2*n; j++) if (j+1 <= 2*n) dp[i][j+1] = min(dp[i][j+1], dp[i+1][j] + cost_level_two[i] - cost_level_one[i]); continue; } for (int j = 0; j <= 2*n; j++) { if (j+1 <= 2*n) dp[i][j+1] = min(dp[i][j+1], dp[i+1][j] + cost_level_one[i]); if (j+2 <= 2*n) dp[i][j+2] = min(dp[i][j+2], dp[i+1][j] + cost_level_two[i]); } } int ans = 0; for (int i = 0; i <= 2*n; i++) if (dp[0][i] <= k) ans = i; return ans; } int max_score(int N, int X, int Y, long long K, vector<int> U, vector<int> V, vector<int> W) { n = N; x = X; y = Y; k = K; for (int i = 0; i < N-1; i++) { adj[U[i]].emplace_back(V[i], W[i]); adj[V[i]].emplace_back(U[i], W[i]); } calcdisX(); calcdisY(); int ans = max(sub1(), sub2()); for (int i = 0; i < N; i++) adj[i].clear(); for (int i = 0; i <= N; i++) for (int j = 0; j <= 2*N; j++) dp[i][j] = 0; return ans; } /* 2 7 0 2 10 0 1 2 0 3 3 1 2 4 2 4 2 2 5 5 5 6 3 4 0 3 20 0 1 18 1 2 1 2 3 19 */ /* 1 4 0 3 20 0 1 18 1 2 1 2 3 19 */
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...