Submission #1356071

#TimeUsernameProblemLanguageResultExecution timeMemory
1356071avighnaReconstruction Project (JOI22_reconstruction)C++20
100 / 100
1695 ms21140 KiB
#include <bits/stdc++.h>

using namespace std;

struct edge {
  int u, v, w;
  bool operator<(const edge &r) const {
    if (w != r.w) {
      return w < r.w;
    }
    if (u != r.u) {
      return u < r.u;
    }
    return v < r.v;
  }
};

class Dsu {
  int n;
  vector<int> par;

public:
  Dsu(int n) : n(n), par(n) {
    iota(par.begin(), par.end(), 0);
  }

  int root(int u) { return u == par[u] ? u : par[u] = root(par[u]); }

  void merge(int u, int v) {
    u = root(u), v = root(v);
    if (u != v) {
      par[v] = u;
    }
  }
};

int main() {
  cin.tie(nullptr)->sync_with_stdio(false);

  int n, m;
  cin >> n >> m;

  vector<edge> edges(m);
  for (auto &[u, v, w] : edges) {
    cin >> u >> v >> w;
  }
  sort(edges.begin(), edges.end());

  vector<pair<int, int>> ev1, ev2;
  auto add = [&](int l, int r, int w) {
    vector<pair<int, int>> ends;
    if (r < w || w < l) {
      ends.push_back({l, r});
    } else {
      ends.push_back({l, w});
      if (w + 1 <= r) {
        ends.push_back({w + 1, r});
      }
    }
    for (auto &[l, r] : ends) {
      if (r <= w) { // [l,r] w, so we add w-i
        ev1.push_back({l, w}), ev1.push_back({r + 1, -w});
        ev2.push_back({l, -1}), ev2.push_back({r + 1, 1});
      } else { // w [l,r], so we add i-w
        ev1.push_back({l, -w}), ev1.push_back({r + 1, w});
        ev2.push_back({l, 1}), ev2.push_back({r + 1, -1});
      }
    }
  };
  for (int i = 0; i < m; ++i) {
    auto [u, v, w] = edges[i];
    Dsu dsu(n + 1);
    int r = int(1e9);
    for (int j = i + 1; j < m; ++j) {
      dsu.merge(edges[j].u, edges[j].v);
      if (dsu.root(u) == dsu.root(v)) {
        r = (w + edges[j].w - 1) / 2;
        break;
      }
    }
    dsu = Dsu(n + 1);
    int l = int(-1e9);
    for (int j = i - 1; j >= 0; --j) {
      dsu.merge(edges[j].u, edges[j].v);
      if (dsu.root(u) == dsu.root(v)) {
        l = (w + edges[j].w + 1) / 2;
        break;
      }
    }
    add(l, r, w);
  }

  sort(ev1.rbegin(), ev1.rend());
  sort(ev2.rbegin(), ev2.rend());
  int q;
  cin >> q;
  int64_t ans = 0, is = 0;
  while (q--) {
    int x;
    cin >> x;
    while (!ev1.empty() && ev1.back().first <= x) {
      ans += ev1.back().second;
      ev1.pop_back();
    }
    while (!ev2.empty() && ev2.back().first <= x) {
      is += ev2.back().second;
      ev2.pop_back();
    }
    cout << ans + is * x << '\n';
  }
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...