Submission #713036

#TimeUsernameProblemLanguageResultExecution timeMemory
713036GrindMachineReconstruction Project (JOI22_reconstruction)C++17
3 / 100
5091 ms75720 KiB
// Om Namah Shivaya #include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> using namespace std; using namespace __gnu_pbds; template<typename T> using Tree = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>; typedef long long int ll; typedef long double ld; typedef pair<int, int> pii; typedef pair<ll, ll> pll; #define fastio ios_base::sync_with_stdio(false); cin.tie(NULL) #define pb push_back #define endl '\n' #define sz(a) a.size() #define setbits(x) __builtin_popcountll(x) #define ff first #define ss second #define conts continue #define ceil2(x, y) ((x + y - 1) / (y)) #define all(a) a.begin(), a.end() #define rall(a) a.rbegin(), a.rend() #define yes cout << "Yes" << endl #define no cout << "No" << endl #define rep(i, n) for(int i = 0; i < n; ++i) #define rep1(i, n) for(int i = 1; i <= n; ++i) #define rev(i, s, e) for(int i = s; i >= e; --i) #define trav(i, a) for(auto &i : a) template<typename T> void amin(T &a, T b) { a = min(a, b); } template<typename T> void amax(T &a, T b) { a = max(a, b); } #ifdef LOCAL #include "debug.h" #else #define debug(x) 42 #endif /* */ const int MOD = 1e9 + 7; const int N = 1e5 + 5; const int inf1 = int(1e9) + 5; const ll inf2 = ll(1e18) + 5; struct DSU { vector<int> par, rankk, siz; int n; DSU() { } DSU(int n) { init(n); } void init(int n_) { n = n_; par = vector<int>(n + 1); rankk = vector<int>(n + 1); siz = vector<int>(n + 1); rep(i, n + 1) create(i); } void reset() { rep(i, n + 1) create(i); } void create(int u) { par[u] = u; rankk[u] = 0; siz[u] = 1; } int find(int u) { if (u == par[u]) return u; else return par[u] = find(par[u]); } bool same(int u, int v) { return find(u) == find(v); } void merge(int u, int v) { u = find(u), v = find(v); if (u == v) return; if (rankk[u] == rankk[v]) rankk[u]++; if (rankk[u] < rankk[v]) swap(u, v); par[v] = u; siz[u] += siz[v]; } }; void solve(int test_case) { int n, m; cin >> n >> m; vector<array<int, 3>> edges(m); rep(i, m) { int u, v, w; cin >> u >> v >> w; edges[i] = {w, u, v}; } sort(all(edges)); vector<int> pickl[m], pickr[m]; vector<ll> active; DSU dsu(n + 5); rep(i, m) { dsu.reset(); pickl[i].pb(i); dsu.merge(edges[i][1], edges[i][2]); vector<ll> nxt; nxt.pb(i); rev(id, i - 1, 0) { if (dsu.same(edges[id][1], edges[id][2])) { conts; } dsu.merge(edges[id][1], edges[id][2]); pickl[i].pb(id); nxt.pb(id); } active = nxt; } active.clear(); rev(i, m - 1, 0) { dsu.reset(); pickr[i].pb(i); dsu.merge(edges[i][1], edges[i][2]); vector<ll> nxt; nxt.pb(i); for (int id = i + 1; id < m; ++id) { if (dsu.same(edges[id][1], edges[id][2])) { conts; } dsu.merge(edges[id][1], edges[id][2]); pickr[i].pb(id); nxt.pb(id); } active = nxt; // pickr[i].erase(pickr[i].begin()); } int q; cin >> q; while (q--) { int k; cin >> k; array<int, 3> key = {k, -1, -1}; auto it = lower_bound(all(edges), key); ll pos = -1; ll mn = inf2; if (it != edges.end()) { ll d = abs((*it)[0] - k); if (d < mn) { mn = d; pos = it - edges.begin(); } } if (it != edges.begin()) { it--; ll d = abs((*it)[0] - k); if (d < mn) { mn = d; pos = it - edges.begin(); } } auto v1 = pickl[pos]; auto v2 = pickr[pos]; int siz1 = sz(v1), siz2 = sz(v2); int ptr1 = 0, ptr2 = 0; dsu.reset(); ll ans = 0; auto add = [&](ll id) { auto [w, u, v] = edges[id]; if (dsu.same(u, v)) return; dsu.merge(u, v); ans += abs(w - k); }; while (ptr1 < siz1 or ptr2 < siz2) { if (ptr1 == siz1) { add(v2[ptr2++]); } else if (ptr2 == siz2) { add(v1[ptr1++]); } else { if (abs(edges[v1[ptr1]][0] - k) <= abs(edges[v2[ptr2]][0] - k)) { add(v1[ptr1++]); } else { add(v2[ptr2++]); } } } cout << ans << endl; } } int main() { fastio; int t = 1; // cin >> t; rep1(i, t) { solve(i); } 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...