제출 #1274126

#제출 시각아이디문제언어결과실행 시간메모리
1274126IcelastReconstruction Project (JOI22_reconstruction)C++20
3 / 100
1143 ms1114112 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<edge>> 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(e[i]);
        for(auto it : lt[i-1]){
            if(dsu.merge(it.u, it.v)){
                lt[i].push_back(it);
            }
        }
    }
    vector<vector<edge>> 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(e[i]);
        for(auto it : rt[i]){
            if(dsu.merge(it.u, 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;
        for(int i = 1; i <= (int)lt[p].size()+(int)rt[p].size(); i++){
            if(p2 == (int)rt[p].size() || (p1 < (int)lt[p].size() && x - lt[p][p1].w <= rt[p][p2].w - x)){
                if(dsu.merge(lt[p][p1].u, lt[p][p1].v)){
                    ans += x - lt[p][p1].w;
                }
                p1++;
            }else{
                if(dsu.merge(rt[p][p2].u, rt[p][p2].v)){
                    ans += rt[p][p2].w - x;
                }
                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...