Submission #1023395

#TimeUsernameProblemLanguageResultExecution timeMemory
1023395j_vdd16Closing Time (IOI23_closing)C++17
8 / 100
86 ms37716 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...