Submission #1186891

#TimeUsernameProblemLanguageResultExecution timeMemory
1186891SalihSahinReconstruction Project (JOI22_reconstruction)C++20
7 / 100
5094 ms12768 KiB
#include "bits/stdc++.h"
#define pb push_back
#define int long long
using namespace std;

const int N = 5e2 + 5;

vector<int> par(N);

int fnd(int a){
    if(a == par[a]) return a;
    return par[a] = fnd(par[a]);
}

bool merge(int a, int b){
    a = fnd(a);
    b = fnd(b);
    if(a == b) return false;
    par[b] = a;
    return true;
}

int32_t main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);

    int n, m;
    cin>>n>>m;
    vector<array<int, 3> > edges(m); // w, u, v
    for(int i = 0; i < m; i++){
        cin>>edges[i][1]>>edges[i][2]>>edges[i][0]; 
    }
    sort(edges.begin(), edges.end());

    int l = -1;

    int q;
    cin>>q;
    while(q--){
        int x;
        cin>>x;

        bool ch = 0;
        while(l < m-1 && edges[l+1][0] <= x) l++;

        int ans = 0, cnt = 0;
        for(int i = 1; i <= n; i++){
            par[i] = i;
        }
        

        int pl = l, pr = l+1;
        while(pl >= 0 && pr < m){
            if(edges[pr][0] - x > x - edges[pl][0]){
                if(merge(edges[pl][1], edges[pl][2])){
                    ans += x - edges[pl][0];
                    cnt++;
                }
                pl--;
            }
            else{
                if(merge(edges[pr][1], edges[pr][2])){
                    ans += edges[pr][0] - x;
                    cnt++;
                }
                pr++;
            }

            if(cnt == n-1) break;
        }

        while(pl >= 0){
            if(merge(edges[pl][1], edges[pl][2])){
                ans += x - edges[pl][0];
                cnt++;
            }
            pl--;
            if(cnt == n-1) break;
        }

        while(pr < m){
           if(merge(edges[pr][1], edges[pr][2])){
                ans += edges[pr][0] - x;
                cnt++;
            }
            pr++; 
            if(cnt == n-1) break;
        }

        cout<<ans<<"\n";
    }
    return 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...