제출 #1274128

#제출 시각아이디문제언어결과실행 시간메모리
1274128IcelastReconstruction Project (JOI22_reconstruction)C++20
70 / 100
5107 ms414740 KiB
#include <iostream> #include <bits/stdc++.h> #define ll long long using namespace std; const ll maxn = 2*1e5+5, INF = 4e18+9; struct DSU{ int n; vector<int> pa, sz; DSU(int n) : n(n){ pa.resize(n+1); sz.resize(n+1, 1); for(int i = 0; i <= n; i++){ pa[i] = i; } }; int find(int x){ while(x != pa[x]){ x = pa[x] = pa[pa[x]]; } return x; } bool same(int x, int y){ return find(x) == find(y); } bool merge(int x, int y){ x = find(x); y = find(y); if(x == y) return false; if(sz[x] < sz[y]) swap(x, y); pa[y] = x; sz[x] += sz[y]; return true; } int size(int x){ return sz[find(x)]; } }; struct edge{ int u, v, w; }; void solve(){ int n, m; cin >> n >> m; vector<edge> e(m+1); for(int i = 1; i <= m; i++){ int u, v, w; cin >> u >> v >> w; e[i] = {u, v, w}; } sort(e.begin()+1, e.end(), [&](edge a, edge b){return a.w < b.w;}); vector<vector<int>> lt(m+1); for(int i = 1; i <= m; i++){ DSU dsu(n+1); dsu.merge(e[i].u, e[i].v); lt[i].push_back(i); for(int it : lt[i-1]){ if(dsu.merge(e[it].u, e[it].v)){ lt[i].push_back(it); } } } vector<vector<int>> rt(m+1); for(int i = m; i >= 1; i--){ DSU dsu(n+1); dsu.merge(e[i].u, e[i].v); rt[i-1].push_back(i); for(int it : rt[i]){ if(dsu.merge(e[it].u, e[it].v)){ rt[i-1].push_back(it); } } } int Q; cin >> Q; int p = 0; for(int i = 1; i <= Q; i++){ int x; cin >> x; while(p+1 <= m && e[p+1].w <= x){ p++; } int p1 = 0, p2 = 0; DSU dsu(n+1); ll ans = 0; vector<int> l = lt[p], r = rt[p]; for(int i = 1; i <= (int)l.size()+(int)r.size(); i++){ if(p2 == (int)r.size() || (p1 < (int)l.size() && x - e[l[p1]].w <= e[r[p2]].w - x)){ int ul = e[l[p1]].u, vl = e[l[p1]].v, wl = x - e[l[p1]].w; if(dsu.merge(ul, vl)){ ans += wl; } p1++; }else{ int ur = e[r[p2]].u, vr = e[r[p2]].v, wr = e[r[p2]].w - x; if(dsu.merge(ur, vr)){ ans += wr; } p2++; } } cout << ans << "\n"; } } int main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); solve(); }
#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...