제출 #992744

#제출 시각아이디문제언어결과실행 시간메모리
992744stdfloat봉쇄 시간 (IOI23_closing)C++17
0 / 100
1084 ms25172 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; int max_score(int n, int X, int Y, long long K, vector<int> U, vector<int> V, vector<int> W) { vector<pii> E[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]}); } 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; } } 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); 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 mx = 0; for (auto i : u) { if ((sm += i) > K) break; mx++; } for (int i = 0; i < n; i++) { for (int j = i; j < n; j++) { vector<ll> c(n, -1); for (auto x : {a, b}) { ll sm = 0; c[x] = max(c[x], 0LL); if (j <= x) { for (int k = x - 1; k >= j; k--) c[k] = max(c[k], sm += v[k + 1].ss); } else { for (int k = x + 1; k <= j; 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) break; cnt++; } mx = max(mx, cnt); } } return mx; }
#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...