Submission #1023392

#TimeUsernameProblemLanguageResultExecution timeMemory
1023392j_vdd16Closing Time (IOI23_closing)C++17
8 / 100
94 ms37968 KiB
#include <algorithm> #include <bitset> #include <cstdint> #include <cstring> #include <iostream> #include <limits.h> #include <math.h> #include <map> #include <numeric> #include <queue> #include <set> #include <stack> #include <string> #include <vector> #define int long long #define loop(X, N) for(int X = 0; X < (N); X++) #define all(V) V.begin(), V.end() #define rall(V) V.rbegin(), V.rend() using namespace std; typedef vector<int> vi; typedef vector<vi> vvi; typedef pair<int, int> ii; typedef vector<ii> vii; typedef vector<vector<ii>> vvii; typedef vector<bool> vb; typedef vector<vector<bool>> vvb; vvii adj; //struct Partition { // Partition(int n) : degrees(vi(n)) {} // // set<int> elements; // vi degrees; // priority_queue<ii, vii, greater<ii>> leaves; //}; void dfs(int node, int cost, vi& costs, vi& parents) { costs[node] = cost; for (auto [child, weight] : adj[node]) { if (child == parents[node]) continue; parents[child] = node; dfs(child, cost + weight, costs, parents); } } signed max_score(signed n, signed x, signed y, int _k, vector<signed> u, vector<signed> v, vector<signed> w) { adj = vvii(n); loop(i, n - 1) { adj[u[i]].push_back({ v[i], w[i] }); adj[v[i]].push_back({ u[i], w[i] }); } vi costX(n), parentX(n); vi costY(n), parentY(n); dfs(x, 0, costX, parentX); dfs(y, 0, costY, parentY); int maxScore = 0; { int k = _k; typedef tuple<int, int, int> iii; priority_queue<iii, vector<iii>, greater<iii>> toAdd; vb vis(n); toAdd.push({ 0, x, -1 }); toAdd.push({ 0, y, -1 }); while (toAdd.size()) { auto [cost, node, parent] = toAdd.top(); toAdd.pop(); if (k - cost < 0) break; vis[node] = true; k -= cost; maxScore++; for (auto [child, weight] : adj[node]) { if (child == parent || vis[child]) continue; toAdd.push({ min(costX[child], costY[child]), child, node }); } } } { //int score = 0; //set<int> fixed; int border = -1; { int ptr = y; while (ptr != x) { if (costX[ptr] < costY[ptr] && border == -1) { border = ptr; break; } ptr = parentX[ptr]; } } for (int doubleCount = 1; true; doubleCount++) { //cout << "Iteration: " << endl; int k = _k; set<int> added; priority_queue<ii, vii, greater<ii>> toAdd; toAdd.push({ max(costX[border], costY[border]), border }); loop(i, doubleCount) { if (toAdd.size() == 0) return maxScore; auto [cost, node] = toAdd.top(); toAdd.pop(); added.insert(node); k -= cost; if (k < 0) return maxScore; //cout << "Added 1: " << node << endl; for (auto [child, weight] : adj[node]) { if (added.count(child)) continue; toAdd.push({ max(costX[child], costY[child]), child }); } } set<int> newSet; while (toAdd.size()) { auto [cost, node] = toAdd.top(); toAdd.pop(); newSet.insert(node); } for (auto [child, weight] : adj[x]) if (added.count(child) == 0) newSet.insert(child); for (auto [child, weight] : adj[y]) if (added.count(child) == 0) newSet.insert(child); int addedCount = 0; int ptr = x; while (added.count(ptr) == 0) { newSet.erase(ptr); added.insert(ptr); k -= costX[ptr]; addedCount++; //cout << "Added 2: " << ptr << endl; ptr = parentY[ptr]; } ptr = y; while (added.count(ptr) == 0) { newSet.erase(ptr); added.insert(ptr); k -= costY[ptr]; addedCount++; //cout << "Added 2: " << ptr << endl; ptr = parentX[ptr]; } if (k < 0) return maxScore; for (int node : newSet) toAdd.push({ min(costX[node], costY[node]), node }); while (toAdd.size()) { auto [cost, node] = toAdd.top(); toAdd.pop(); added.insert(node); if (k < cost) break; addedCount++; //cout << "Added 3: " << node << endl; k -= cost; for (auto [child, weight] : adj[node]) { if (added.count(child)) continue; toAdd.push({ min(costX[child], costY[child]), child }); } } maxScore = max(maxScore, /*score + */2 * doubleCount + addedCount); } } return maxScore; }
#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...