Submission #779362

#TimeUsernameProblemLanguageResultExecution timeMemory
779362ymmReconstruction Project (JOI22_reconstruction)C++17
100 / 100
991 ms31700 KiB
#include <bits/stdc++.h> #define Loop(x,l,r) for (ll x = (l); x < (ll)(r); ++x) #define LoopR(x,l,r) for (ll x = (r)-1; x >= (ll)(l); --x) typedef long long ll; typedef std::pair<int, int> pii; typedef std::pair<ll , ll > pll; using namespace std; const int N = 512; namespace dsu { struct edge { int v, u, w; int nxt; } edges[(1<<27)/sizeof(edge)]; int new_edge() { static int nxt = 1; return nxt++; } int st; void push(int v, int u, int w) { int e = new_edge(); edges[e].v = v; edges[e].u = u; edges[e].w = w; edges[e].nxt = st; st = e; } int par[N]; int sz[N]; int rt(int v) { return par[v] == -1? v: rt(par[v]); } bool unite(int v, int u) { v = rt(v); u = rt(u); if (v == u) return 0; if (sz[v] < sz[u]) swap(v, u); sz[v] += sz[u]; par[u] = v; return 1; } int Do(int v, int u) { fill(par, par+N, -1); fill(sz, sz+N, 1); for (int *e = &st; *e;) { int x = edges[*e].v; int y = edges[*e].u; if (!unite(x, y)) { *e = edges[*e].nxt; continue; } v = rt(v); u = rt(u); if (v == u) return edges[*e].w; e = &edges[*e].nxt; } return -1; } } vector<pair<int,pii>> E; vector<pii> ev; int n, m; int main() { cin.tie(0) -> sync_with_stdio(false); cin >> n >> m; Loop (i,0,m) { int v, u, w; cin >> v >> u >> w; --v; --u; E.push_back({w, {v, u}}); } sort(E.begin(), E.end()); Loop (i,0,E.size()) { auto [w, dard] = E[i]; auto [v, u] = dard; int x = dsu::Do(v, u); if (x == -1) { ev.push_back({0, w}); //cerr << w << ' ' << ev.back().first << '\n'; } else if (x != w) { ev.push_back({(x+w+2)/2, w}); //cerr << w << ' ' << ev.back().first << '\n'; } dsu::push(v, u, w); } dsu::st = 0; for (int l = m, r = m; r > 0; r = l) { while (l > 0 && E[l-1].first == E[r-1].first) --l; Loop (i,l,r) { auto [w, dard] = E[i]; auto [v, u] = dard; int x = dsu::Do(v, u); if (x != -1 && x != w) { ev.push_back({(x+w)/2+1, ~w}); //cerr << w << ' ' << x << ' ' << ev.back().first << "-" << '\n'; } dsu::push(v, u, w); } } sort(ev.begin(), ev.end()); int p = 0; ll ans = 0; int q; cin >> q; multiset<int> Sr; ll suml = 0, sumr = 0; ll cntl = 0, cntr = 0; while (q--) { int x; cin >> x; multiset<int>::iterator it; while (Sr.size() && *(it = Sr.begin()) < x) { sumr -= *it; suml += *it; cntr--; cntl++; Sr.erase(it); } while (p < ev.size() && ev[p].first <= x) { int dard = ev[p++].second; if (dard < 0) { dard = ~dard; if (dard < x) { suml -= dard; cntl--; } else { sumr -= dard; cntr--; auto it = Sr.find(dard); assert(it != Sr.end()); Sr.erase(it); } } else { if (dard < x) { suml += dard; cntl++; } else { sumr += dard; cntr++; Sr.insert(dard); } } } ll ans = (cntl*x - suml) + (sumr - cntr*x); //cerr << cntl << " " << suml << " - " << cntr << " " << sumr << '\n'; cout << ans << '\n'; //cerr << "Hi\n"; } }

Compilation message (stderr)

reconstruction.cpp: In function 'int main()':
reconstruction.cpp:131:12: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  131 |   while (p < ev.size() && ev[p].first <= x) {
      |          ~~^~~~~~~~~~~
reconstruction.cpp:114:5: warning: unused variable 'ans' [-Wunused-variable]
  114 |  ll ans = 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...