Submission #1033928

#TimeUsernameProblemLanguageResultExecution timeMemory
1033928AlishReconstruction Project (JOI22_reconstruction)C++14
100 / 100
1239 ms53596 KiB
#include <bits/stdc++.h>

using namespace std;

typedef long long int	ll;
typedef pair<int, int>	pii;
typedef pair<ll, ll>	pll;


#define F		        first
#define S		        second
#define pb		        push_back
#define endl            '\n'
#define Mp              make_pair
#define all(x)          x.begin(), x.end()
#define debug(x)        cerr << #x << " = " << x << endl;
#define fast_io         ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define file_io         freopen("tests.in" , "r" , stdin) ;

ll mod = 1e9+7;


const int N = 523, M=1e5+23, QQ=1e6+23;

int sz[N], par[N];
int L[M], R[M];
ll pref[QQ], small[QQ];
vector<ll> Q;
vector<pair<ll, pll> > E;
int n, m, q;


int getPar(int v){
    if(par[v]==-1) return v;
    return par[v]=getPar(par[v]);
}

bool Union(int u, int v){
    u=getPar(u);
    v=getPar(v);
    if(v==u) return 0;
    if(sz[v]<sz[u]) swap(u, v);
    par[u]=v;
    sz[v]+=sz[u];
    return 1;
}

int main()
{
    fast_io
    cin>>n>>m;
    for (int i=0; i<m; i++){
        int v, u, w;
        cin>>v>>u>>w;
        E.pb({w, {v, u}});
    }
    sort(all(E));
    cin>>q;
    for (int i=0; i<q; i++){
        int x; cin>>x;
        Q.pb(x);
    }

    for (int i=0; i<m; i++){
        int v=E[i].S.F, u=E[i].S.S;
        for (int j=1; j<=n; j++){
            par[j]=-1;
            sz[j]=1;
        }
        L[i]=-1;
        R[i]=m;
        for (int j=i-1; j>=0; j--)if(Union(E[j].S.F, E[j].S.S) && getPar(u)==getPar(v)){
            L[i]=j;
            break;
        }
        for (int j=1; j<=n; j++){
            par[j]=-1;
            sz[j]=1;
        }
        for (int j=i+1; j<m; j++)if(Union(E[j].S.F, E[j].S.S) && getPar(u)==getPar(v)){
            R[i]=j;
            break;
        }

    }

    for (int i=0; i<m; i++){
        int l=0, mid, r=q;
        if(L[i]!=-1) l=lower_bound(all(Q), (E[i].F+E[L[i]].F+1)/2)-Q.begin();
        pref[l]+=E[i].F;
        small[l]--;
        mid=lower_bound(all(Q), E[i].F)-Q.begin();
        pref[mid]-=2*E[i].F;
        small[mid]+=2;
        if(R[i]!=m) r=lower_bound(all(Q), (E[i].F+E[R[i]].F+1)/2)-Q.begin();
        pref[r]+=E[i].F;
        small[r]--;
    }
    for (int i=1; i<q; i++){
        pref[i]+=pref[i-1];
        small[i]+=small[i-1];
    }
    for (int i=0; i<q; i++) cout<<pref[i]+Q[i]*small[i]<<endl;

}
/*


*/
#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...