제출 #1313956

#제출 시각아이디문제언어결과실행 시간메모리
1313956mikolaj00Reconstruction Project (JOI22_reconstruction)C++20
100 / 100
1267 ms23020 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; struct DSU { DSU(int size) : arr(size), size(size, 1) { for (int i = 0; i < arr.size(); i++) arr[i] = i; } int find(int k) { if (arr[k] == k) return k; return arr[k] = find(arr[k]); } inline bool connected(int a, int b) { return find(a) == find(b); } void join(int a, int b) { if (connected(a, b)) return; int r_a = find(a), r_b = find(b); if (size[r_a] < size[r_b]) swap(r_a, r_b); size[r_a] += size[r_b]; arr[r_b] = r_a; } vector<int> size; vector<int> arr; }; struct Edge { int u, v; ll w; bool operator<(Edge const& other) { return w < other.w; } }; struct Sweep { ll t, a, b; bool operator<(Sweep const& other) { return t < other.t; } }; int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); int n, m; cin >> n >> m; vector<Edge> edges(m); for (int i = 0; i < m; i++) cin >> edges[i].u >> edges[i].v >> edges[i].w; sort(edges.begin(), edges.end()); vector<int> l(m, -1e9), r(m, 1e9); for (int i = 0; i < m; i++) { DSU dsu(n+1); for (int j = i-1; j >= 0; j--) { dsu.join(edges[j].u, edges[j].v); if (dsu.connected(edges[i].u, edges[i].v)) { l[i] = (edges[i].w + edges[j].w)/2 + 1; break; } } } for (int i = 0; i < m; i++) { DSU dsu(n+1); for (int j = i+1; j < m; j++) { dsu.join(edges[j].u, edges[j].v); if (dsu.connected(edges[i].u, edges[i].v)) { r[i] = (edges[i].w + edges[j].w)/2; break; } } } vector<Sweep> sweep; for (int i = 0; i < m; i++) { sweep.push_back({l[i], -1LL, edges[i].w}); sweep.push_back({edges[i].w, 2LL, -2LL*edges[i].w}); sweep.push_back({r[i]+1, -1LL, edges[i].w}); } sort(sweep.begin(), sweep.end()); int idx = 0; ll a = 0, b = 0; int q; cin >> q; for (int i = 0; i < q; i++) { int x; cin >> x; while (idx < sweep.size() && sweep[idx].t <= x) { a += sweep[idx].a; b += sweep[idx].b; idx++; } ll ans = a*x + b; cout << ans << '\n'; } }
#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...