제출 #1185970

#제출 시각아이디문제언어결과실행 시간메모리
1185970gygNile (IOI24_nile)C++20
32 / 100
69 ms15604 KiB
#include "nile.h" #include <bits/stdc++.h> using namespace std; #define sig signed #define int long long #define arr array #define vec vector #define pii pair<int, int> #define fir first #define sec second const int N = 1e5 + 5, INF = 1e18; int n; arr<pii, N> a; vec<vec<int>> edg; struct Dsj { arr<int, N> prnt, sz; void intl() { for (int u = 1; u <= n; u++) prnt[u] = u, sz[u] = 1; } int pr(int u) { return (u == prnt[u]) ? u : prnt[u] = pr(prnt[u]); } void mrg(int u, int v) { u = pr(u), v = pr(v); assert(u != v); prnt[v] = u, sz[u] += sz[v]; } int evl(int u) { u = pr(u); return (sz[u] % 2 == 1) ? sz[u] - 1 : sz[u]; } } dsj; vec<int> calculate_costs(vec<sig> _ps, vec<sig> _fl, vec<sig> _pr, vec<sig> _qr) { n = _ps.size(); int whl = 0; for (int i = 1; i <= n; i++) { a[i] = {_ps[i - 1], _fl[i - 1] - _pr[i - 1]}; whl += _fl[i - 1]; } sort(a.begin() + 1, a.begin() + n + 1); for (int i = 1; i <= n - 1; i++) edg.push_back({a[i + 1].fir - a[i].fir, i, i + 1}); sort(edg.begin(), edg.end()); dsj.intl(); vec<pii> crt = {{0, 0}}; int sm = 0; for (vec<int> x : edg) { int d = x[0], u = x[1], v = x[2]; if (dsj.pr(u) == dsj.pr(v)) continue; sm -= dsj.evl(u), sm -= dsj.evl(v); dsj.mrg(u, v); sm += dsj.evl(u); crt.push_back({d, sm}); } vec<int> ans; for (int d : _qr) { int lw = 0, hg = crt.size() - 1; while (lw < hg) { int md = (lw + hg + 1) / 2; if (d >= crt[md].fir) lw = md; else hg = md - 1; } ans.push_back(whl - crt[lw].sec); } return ans; }
#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...