Submission #992724

#TimeUsernameProblemLanguageResultExecution timeMemory
992724stdfloatClosing Time (IOI23_closing)C++17
21 / 100
1056 ms25324 KiB
#include <bits/stdc++.h> #include "closing.h" using namespace std; #define ff first #define ss second #define pii pair<int, int> using ll = long long; vector<bool> vis; vector<ll> c; vector<vector<pii>> E; bool dfs(int x, int p = -1, ll sm = 0) { bool tr = false; if (vis[x]) { tr = true; c[x] = max(c[x], sm); } for (auto [i, w] : E[x]) { if (i != p && dfs(i, x, sm + w)) { tr = true; c[x] = max(c[x], sm); } } return tr; } int max_score(int n, int X, int Y, long long K, vector<int> U, vector<int> V, vector<int> W) { E.assign(n, {}); for (int i = 0; i < n - 1; i++) { E[U[i]].push_back({V[i], W[i]}); E[V[i]].push_back({U[i], W[i]}); } auto f = [&](int st) -> vector<ll> { queue<int> q; vector<ll> dis(n, -1); q.push(st); dis[st] = 0; while (!q.empty()) { auto x = q.front(); q.pop(); for (auto [i, w] : E[x]) { if (dis[i] == -1) { dis[i] = dis[x] + w; q.push(i); } } } return dis; }; vector<ll> disx = f(X), disy = f(Y); vector<pii> v; for (int i = 0; i < n; i++) { if ((int)E[i].size() == 1) { v.push_back({i, 0}); queue<int> q; vector<bool> vis(n); q.push(i); vis[i] = true; while (!q.empty()) { auto x = q.front(); q.pop(); for (auto [j, w] : E[x]) { if (!vis[j]) { q.push(j); vis[j] = true; v.push_back({j, w}); } } } break; } } for (auto [i, w] : v) { if (i == X || i == Y) { if (i == Y) swap(X, Y); break; } } int a = -1, b = -1; for (int i = 0; i < (int)v.size(); i++) { if (v[i].ff == X) a = i; else if (v[i].ff == Y) b = i; } if (b == -1) b = a; vector<int> u; for (int k = 0; k < n; k++) u.push_back(min(disx[v[k].ff], disy[v[k].ff])); sort(u.begin(), u.end()); ll sm = 0; int cnt = 0; for (auto i : u) { if ((sm += i) <= K) cnt++; else break; } int mx = cnt; for (int i = 0; i < n; i++) { for (int j = i; j < n; j++) { vector<ll> c(n, -1); for (auto x : {a, b}) { for (auto y : {i, j}) { ll sm = 0; c[x] = max(c[x], 0LL); if (y <= x) { for (int k = x - 1; k >= y; k--) c[k] = max(c[k], sm += v[k + 1].ss); } else { for (int k = x + 1; k <= y; k++) c[k] = max(c[k], sm += v[k].ss); } } } ll sm = 0; for (auto k : c) if (k != -1) sm += k; if (sm > K) break; vector<int> u; for (int k = 0; k < n; k++) if (c[k] == -1) u.push_back(min(disx[v[k].ff], disy[v[k].ff])); sort(u.begin(), u.end()); int cnt = 0; for (int i = 0; i < n; i++) if (c[i] != -1) cnt += 1 + (c[i] != min(disx[i], disy[i])); for (auto i : u) { if ((sm += i) <= K) cnt++; else break; } mx = max(mx, cnt); } } assert(a != b); return mx + (a == b ? mx : 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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...