Submission #1205864

#TimeUsernameProblemLanguageResultExecution timeMemory
1205864PacybwoahClosing Time (IOI23_closing)C++20
8 / 100
141 ms55828 KiB
#include "closing.h" #include<iostream> #include<vector> #include<algorithm> #include<utility> using namespace std; typedef long long ll; namespace{ vector<vector<pair<int, ll>>> graph; int n; ll k; int sz; int a, b; vector<pair<ll, ll>> dists; vector<int> p, vec, szs, inp; vector<vector<ll>> cost, rc; void dfs1(int node, int parent, int day){ p[node] = parent; for(auto &[x, l]: graph[node]){ if(x == parent) continue; if(day == 0) dists[x].first = dists[node].first + l; else dists[x].second = dists[node].second + l; dfs1(x, node, day); } } void dfs2(int node, int parent, int rt){ for(auto &[x, l]: graph[node]){ if(x == parent) continue; if(inp[x]) continue; cost[rt].push_back(dists[x].first); dfs2(x, node, rt); } } } int max_score(int N, int X, int Y, long long K, std::vector<int> U, std::vector<int> V, std::vector<int> W){ n = N; k = K; a = X + 1; b = Y + 1; vector<vector<pair<int, ll>>>().swap(graph); vector<pair<ll, ll>>().swap(dists); vector<int>().swap(p); vector<int>().swap(vec); vector<int>().swap(szs); vector<int>().swap(inp); vector<vector<ll>>().swap(cost); vector<vector<ll>>().swap(rc); graph.resize(n + 1); dists.resize(n + 1); p.resize(n + 1); inp.resize(n + 1); for(int i = 0; i < n - 1; i++){ graph[U[i] + 1].emplace_back(V[i] + 1, W[i]); graph[V[i] + 1].emplace_back(U[i] + 1, W[i]); } dfs1(a, a, 0); int cur = b; while(cur != a){ vec.push_back(cur); cur = p[cur]; } vec.push_back(a); vec.push_back(0); reverse(vec.begin(), vec.end()); sz = (int)vec.size() - 1; szs.resize(sz + 1); cost.resize(sz + 1); rc.resize(sz + 1); dfs1(b, b, 1); for(int i = 1; i <= n; i++){ if(dists[i].first > dists[i].second) swap(dists[i].first, dists[i].second); } for(int i = 1; i <= sz; i++) inp[vec[i]] = 1; for(int i = 1; i <= sz; i++){ cost[i].push_back(0); dfs2(vec[i], vec[i], i); szs[i] = (int)cost[i].size() - 1; sort(cost[i].begin(), cost[i].end()); ll diff = dists[vec[i]].second - dists[vec[i]].first; rc[i].resize(2 * szs[i] + 1); int ptr = 0; while(ptr < szs[i] && cost[i][ptr + 1] <= diff){ ptr++; rc[i][ptr] = rc[i][ptr - 1] + cost[i][ptr]; } for(int j = 1; j <= ptr; j++) rc[i][ptr + j] = rc[i][ptr + j - 1] + diff; for(int j = ptr + 1; j <= szs[i]; j++){ rc[i][2 * j - 1] = rc[i][2 * j - 2] + cost[i][j]; rc[i][2 * j] = rc[i][2 * j - 1] + diff; } } vector<ll> pa(sz + 1), pb(sz + 1); for(int i = 1; i <= sz; i++){ pa[i] = pa[i - 1] + dists[vec[i]].first; pb[i] = pb[i - 1] + dists[vec[i]].second - dists[vec[i]].first; } if(dists[b].second > 2 * k){ vector<ll> tmp; for(int i = 1; i <= n; i++) tmp.push_back(dists[i].first); sort(tmp.begin(), tmp.end()); ll sum = 0; for(int i = 0; i < n; i++){ sum += tmp[i]; if(sum > k) return i; } return n; } return 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...