Submission #781690

#TimeUsernameProblemLanguageResultExecution timeMemory
781690PoonYaPatReconstruction Project (JOI22_reconstruction)C++14
100 / 100
1273 ms35060 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

struct Edge {
    ll w,a,b;
    bool operator < (const Edge &o) const {return w<o.w;}
};

int n,m,bef[100005],aft[100005],p[505],r[505];
Edge edge[100005];
vector<Edge> v;

int find(int x) {
    while (x!=p[x]) x=p[x];
    return x;
}

void unite(int a, int b) {
    a=find(a); b=find(b);
    if (a!=b) {
        if (r[a]>r[b]) swap(a,b);
        p[a]=b;
        if (r[a]==r[b]) ++r[b];
    }
}

int main() {
    ios_base::sync_with_stdio(0); cin.tie(0);
    cin>>n>>m;
    for (int i=1; i<=m; ++i) cin>>edge[i].a>>edge[i].b>>edge[i].w;
    sort(edge+1,edge+m+1);

    for (int i=1; i<=m; ++i) {
        bef[i]=i-1;
        for (int j=1; j<=n; ++j) r[j]=1, p[j]=j;
        while (bef[i]) {
            unite(edge[bef[i]].a,edge[bef[i]].b);
            if (find(edge[i].a)==find(edge[i].b)) break;
            --bef[i];
        }
    }

    for (int i=1; i<=m; ++i) aft[i]=m+1;
    for (int i=1; i<=m; ++i) aft[bef[i]]=i;

    for (int i=1; i<=m; ++i) {
        if (bef[i]) v.push_back({(edge[i].w+edge[bef[i]].w)/2+1,-1ll,edge[i].w});
        else v.push_back({0,-1ll,edge[i].w});

        v.push_back({edge[i].w,2ll,-2*edge[i].w});

        if (aft[i]!=m+1) v.push_back({(edge[i].w+edge[aft[i]].w)/2+1,-1ll,edge[i].w});
    }
    sort(v.begin(),v.end());

    int q; cin>>q;
    int idx=0;
    ll cnt1=0,cnt2=0;
    while (q--) {
        ll x; cin>>x;
        while (idx<v.size() && v[idx].w<=x) {
            cnt1+=v[idx].a;
            cnt2+=v[idx].b;
            ++idx;
        }
        cout<<cnt1*x+cnt2<<"\n";
    }
}

Compilation message (stderr)

reconstruction.cpp: In function 'int main()':
reconstruction.cpp:62:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<Edge>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   62 |         while (idx<v.size() && v[idx].w<=x) {
      |                ~~~^~~~~~~~~
#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...