제출 #569865

#제출 시각아이디문제언어결과실행 시간메모리
569865ryangohca자매 도시 (APIO20_swap)C++17
13 / 100
518 ms36984 KiB
#include "swap.h" #include <bits/stdc++.h> using namespace std; int p[100001], pweight[100001][20], st[100001], en[100001], lineWeight[100001], twok[100001][20]; vector<int> linNodes[100001]; void init(int N){ iota(p, p+N, 0); iota(st, st+N, 0); iota(en, en+N, 0); fill(lineWeight, lineWeight+N, 2e9); for (int i = 0; i < N; i++) linNodes[i].push_back(i); memset(twok, -1, sizeof twok); memset(pweight, -1, sizeof pweight); } int fs(int x){ if (p[x] == x) return x; return p[x] = fs(p[x]); } void ms(int x, int y, int w){ int px = fs(x), py = fs(y); if (px == py && lineWeight[px] == 2e9){ st[px] = en[px] = -1; for (auto i : linNodes[px]){ lineWeight[i] = min(lineWeight[i], w); } return; } if (linNodes[px].size() < linNodes[py].size()) {swap(x, y); swap(px, py);} p[py] = px; // px -> py //cout << px << ' ' << py << ' ' << w << endl; twok[py][0] = px; pweight[py][0] = w; if (st[px] != -1 && st[py] != -1){ if ((st[px] == x || en[px] == x) && (st[py] == y || en[py] == y)){ st[px] = (st[px] == x ? en[px] : st[px]); en[px] = (st[py] == y ? en[py] : st[py]); for (auto i : linNodes[py]){ linNodes[px].push_back(i); } } else { st[px] = en[px] = -1; for (auto i : linNodes[px]){ lineWeight[i] = min(lineWeight[i], w); } for (auto i : linNodes[py]){ lineWeight[i] = min(lineWeight[i], w); } } } else if (st[px] != -1){ st[px] = en[px] = -1; for (auto i : linNodes[px]){ lineWeight[i] = w; } } else if (st[py] != -1){ st[py] = en[py] = -1; for (auto i : linNodes[py]){ lineWeight[i] = w; } } else { lineWeight[px] = min(lineWeight[px], lineWeight[py]); } } void init(int N, int M, std::vector<int> U, std::vector<int> V, std::vector<int> W) { init(N); vector<tuple<int, int, int>> edges; for (int i = 0; i < M; i++){ edges.push_back({W[i], U[i], V[i]}); } sort(edges.begin(), edges.end()); for (auto [w, a, b] : edges){ ms(a, b, w); } for (int i = 1; i <= 19; i++){ for (int j = 0; j < N; j++){ if (twok[j][i-1] != -1){ twok[j][i] = twok[twok[j][i-1]][i-1]; pweight[j][i] = max(pweight[j][i-1], pweight[twok[j][i-1]][i-1]); } } } } bool isOkay(int mid, int X, int Y){ for (int i = 19; i >= 0; i--){ if (twok[X][i] != -1 && pweight[X][i] <= mid) X = twok[X][i]; if (twok[Y][i] != -1 && pweight[Y][i] <= mid) Y = twok[Y][i]; } if (X != Y) return false; return lineWeight[X] != -1 && lineWeight[X] <= mid; } int getMinimumFuelCapacity(int X, int Y) { int mini = 0, maxi = 1e9+10; while (maxi - mini > 1){ int mid = (maxi + mini) / 2; if (isOkay(mid, X, Y)) maxi = mid; else mini = mid; } return (maxi==1e9+10?-1:maxi); }
#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...