Submission #940324

#TimeUsernameProblemLanguageResultExecution timeMemory
940324GhettoClosing Time (IOI23_closing)C++17
8 / 100
97 ms27340 KiB
#include "closing.h" #include <bits/stdc++.h> using namespace std; using lint = long long; using pil = pair<int, lint>; using pli = pair<lint, int>; const int MAX_N = 2e5 + 5; const lint INF = 5e18; int n, x, y; lint k; vector<pil> adj[MAX_N]; bool seen[MAX_N]; lint min_dist[MAX_N]; priority_queue<pli, vector<pli>, greater<pli>> order; void dijk(int s) { for (int i = 0; i <= n - 1; i++) { min_dist[i] = INF; seen[i] = false; } min_dist[s] = 0; order.push({0, s}); while (order.size()) { int u = order.top().second; order.pop(); if (seen[u]) continue; seen[u] = true; for (pil e : adj[u]) { lint new_dist = min_dist[u] + e.second; if (new_dist >= min_dist[e.first]) continue; min_dist[e.first] = new_dist; order.push({new_dist, e.first}); } } } lint dist[MAX_N]; void precomp() { dijk(x); for (int i = 0; i <= n - 1; i++) if (min_dist[i] <= k) dist[i] = min_dist[i]; dijk(y); for (int i = 0; i <= n - 1; i++) if (min_dist[i] <= k) dist[i] = min_dist[i]; } bool taken[MAX_N]; set<pli> order2; // {dist, node} void init() { for (int i = 0; i <= n - 1; i++) { adj[i].clear(); dist[i] = INF; taken[i] = false; } order2.clear(); } int max_score(int tmp_n, int tmp_x, int tmp_y, lint tmp_k, vector<int> edge1, vector<int> edge2, vector<int> edge3) { n = tmp_n; x = tmp_x; y = tmp_y; k = tmp_k; init(); for (int i = 0; i <= n - 2; i++) { adj[edge1[i]].push_back({edge2[i], edge3[i]}); adj[edge2[i]].push_back({edge1[i], edge3[i]}); } precomp(); order2.insert({0, x}); order2.insert({0, y}); lint sum = 0; while (order2.size()) { int u = order2.begin()->second; order2.erase(order2.begin()); if (sum + dist[u] > k) break; taken[u] = true; sum += dist[u]; for (pil e : adj[u]) { if (taken[e.first]) continue; if (order2.count({dist[e.first], e.first})) continue; order2.insert({dist[e.first], e.first}); } } int ans = 0; for (int i = 0; i <= n - 1; i++) ans += taken[i]; 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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...