Submission #871052

#TimeUsernameProblemLanguageResultExecution timeMemory
871052serifefedartarSwapping Cities (APIO20_swap)C++17
6 / 100
219 ms47464 KiB
#include <bits/stdc++.h> #include "swap.h" using namespace std; #define fast ios::sync_with_stdio(0);cin.tie(0); #define s second #define f first typedef long long ll; const ll MOD = 1e9+9; const ll LOGN = 20; const ll MAXN = 1e5 + 100; int par[3 * MAXN], deg[3 * MAXN], w[3 * MAXN], nds; int depth[3 * MAXN], up[LOGN][3 * MAXN]; bool reach[3 * MAXN]; vector<pair<int,pair<int,int>>> edges; vector<vector<int>> graph; int find(int node) { if (node == par[node]) return node; return par[node] = find(par[node]); } void addEdge(int u, int v) { int old_u = u, old_v = v; u = find(u), v = find(v); par[nds] = nds; par[u] = par[v] = nds; graph[nds].push_back(u); reach[nds] = reach[u] || reach[v] || (u == v); if (u != v) { graph[nds].push_back(v); reach[nds] |= (max(++deg[old_u], ++deg[old_v]) > 2); } } void dfs(int node) { for (auto u : graph[node]) { if (up[0][node] == u) continue; depth[u] = depth[node] + 1; up[0][u] = node; for (int i = 1; i < LOGN; i++) up[i][u] = up[i-1][up[i-1][u]]; dfs(u); } } int find(int node, int k) { for (int i = LOGN-1; i >= 0; i--) { if ((1<<i) & k) node = up[i][node]; } return node; } int lca(int u, int v) { if (depth[v] > depth[u]) swap(u, v); u = find(u, depth[u] - depth[v]); if (u == v) return u; for (int i = LOGN - 1; i >= 0; i--) { if (up[i][u] != up[i][v]) { u = up[i][u]; v = up[i][v]; } } return up[0][u]; } int first_active(int node) { if (reach[node]) return node; for (int i = LOGN - 1; i >= 0; i--) { if (reach[up[i][node]] == 0) node = up[i][node]; } return up[0][node]; } void init(int N, int M, vector<int> U, vector<int> V, vector<int> W) { nds = N; graph = vector<vector<int>>(N+M+1, vector<int>()); for (int i = 1; i <= N; i++) par[i] = i; for (int i = 0; i < M; i++) edges.push_back({W[i], {U[i] + 1, V[i] + 1}}); sort(edges.begin(), edges.end()); for (int i = 0; i < M; i++) { nds++; w[nds] = edges[i].f; addEdge(edges[i].s.f, edges[i].s.s); } for (int j = 0; j < LOGN; j++) up[j][nds] = nds; dfs(nds); } int getMinimumFuelCapacity(int X, int Y) { int Q = first_active(lca(X, Y)); if (reach[Q]) return w[Q]; else return -1; }
#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...