Submission #1208957

#TimeUsernameProblemLanguageResultExecution timeMemory
1208957Braabebo10Reconstruction Project (JOI22_reconstruction)C++20
0 / 100
5103 ms219440 KiB
#include<bits/stdc++.h> #define ll long long #define nl "\n" #define all(v) v.begin(),v.end() #define baraa ios_base::sync_with_stdio(false);cin.tie(NULL); using namespace std; struct DSU { ll connected; vector<ll> par, sz; stack<array<ll, 2> > st; DSU(ll n) { par = sz = vector<ll>(n + 1, 0); for (ll i = 1; i <= n; i++) par[i] = i, sz[i] = 1; connected = n; } ll findparent(ll u) { if (par[u] == u)return u; ll parent = findparent(par[u]); //if not rollback, uncomment par[u] = parent; return parent; } ll getsize(ll u) { return sz[findparent(u)]; } void unite(ll u, ll v) { ll par1 = findparent(u), par2 = findparent(v); st.push({-1, -1}); if (par1 == par2) return; if (sz[par1] > sz[par2]) swap(par1, par2); st.pop(); st.push({connected, par1}); connected--; sz[par2] += sz[par1]; par[par1] = par2; } void rollback() { if (st.size()) { auto x = st.top(); st.pop(); if (x[0] == -1)return; connected = x[0]; par[x[1]] = x[1]; } } bool is_connected(ll u, ll v) { return findparent(u) == findparent(v); } }; array<ll, 2> getS(vector<pair<ll, ll> > &a, ll x) { ll sz = a.size(), l = 0, r = sz - 1, ans = -1; while (l <= r) { ll mid = (l + r) / 2; if (a[mid].first > x)r = mid - 1; else l = mid + 1, ans = mid; } if (ans == -1)return {0LL, 0LL}; return {ans + 1, a[ans].second}; } int main() { baraa ll n, m; cin >> n >> m; vector<array<ll, 3> > edges(m); map<ll, vector<array<ll, 2> > > mp; for (auto &[w, u, v]: edges) { cin >> u >> v >> w; mp[w].push_back({u, v}); } sort(all(edges)); map<ll, vector<pair<ll, ll> > > cost; map<ll, ll> valid; vector<ll> weights; for (auto [cur, vec]: mp) { DSU dsu(n); weights.push_back(cur); ll prf = 0; for (auto [w, u, v]: edges) { if (w >= cur and !dsu.is_connected(u, v)) dsu.unite(u, v), prf += w, cost[cur].push_back({w, prf}); } valid[cur] = dsu.connected == 1; } auto nxtW = [&](ll x) { ll it = (upper_bound(all(weights), x)) - weights.begin(); if (it == weights.size() or (it > 0 and weights[it - 1] == x))it--; // cout << x << ' ' << weights[it] << nl; return weights[it]; }; ll q; cin >> q; while (q--) { ll x; cin >> x; ll l = 0, r = 2e9 + 1, ans = 0; while (l <= r) { ll mid = (l + r) / 2, st = max(1LL, x - mid), ed = x + mid; // cout << mid << nl; if (!valid[nxtW(st)] or cost[nxtW(st)].back().first > ed)l = mid + 1; else r = mid - 1, ans = mid; } ll st = max(1LL, x - ans), ed = x + ans, res = 0; auto [cnt, sm] = getS(cost[nxtW(st)], x); res += cnt * x - sm; cnt = cost[nxtW(st)].size() - cnt; sm = cost[nxtW(st)].back().second - sm; res += sm - cnt * x; cout << res << nl; } return 0; }
#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...