제출 #873698

#제출 시각아이디문제언어결과실행 시간메모리
873698vjudge1Reconstruction Project (JOI22_reconstruction)C++17
7 / 100
5074 ms8852 KiB
#include<bits/stdc++.h>
#define pb push_back
#define pli pair<int,int>
#define fi first
#define se second
#define fastio ios_base::sync_with_stdio(false); cin.tie(NULL);
using namespace std;
using ll=long long;
const ll maxn=2e5;
const ll inf=1e18;
const ll mod=1e9+7;
ll lab[maxn];
ll u[maxn],v[maxn],w[maxn];
ll findset(ll x)
{
    return lab[x]<0?x:lab[x]=findset(lab[x]);
}
bool unite(ll u,ll v)
{
    u=findset(u);
    v=findset(v);
    if(u==v) return false;
    if(lab[u]>lab[v]) swap(u,v);
    lab[u]+=lab[v];
    lab[v]=u;
    return true;
}
ll n,m,q;
void solve()
{
    cin >> n >> m;
    for(int i=1;i<=m;i++)
    {
        cin >> u[i] >> v[i] >> w[i];
    }
    cin >> q;
    while(q--)
    {
        ll x;
        cin >> x;
        vector<pli>a,b;
        for(int j=1;j<=m;j++)
        {
            if(w[j]<=x)
            {
                a.pb({x-w[j],j});
            }
            else
            {
                b.pb({w[j]-x,j});
            }
        }
        sort(a.begin(),a.end());
        sort(b.begin(),b.end());
        vector<ll>c,d;
        for(int i=1;i<=n;i++) lab[i]=-1;
        for(int j=0;j<a.size();j++)
        {
            ll id=a[j].se;
            if(unite(u[id],v[id])) c.pb(id);
        }
        for(int i=1;i<=n;i++) lab[i]=-1;
        for(int j=0;j<b.size();j++)
        {
            ll id=b[j].se;
            if(unite(u[id],v[id])) d.pb(id);
        }
        for(int i=1;i<=n;i++) lab[i]=-1;
        ll j=0,k=0,ans=0;
        while(-lab[findset(1)]!=n)
        {
            if(j==c.size())
            {
                ans+=unite(u[d[k]],v[d[k]])*abs(w[d[k]]-x);
                k++;
                continue;
            }
            if(k==d.size())
            {
                ans+=unite(u[c[j]],v[c[j]])*abs(w[c[j]]-x);
                j++;
                continue;
            }
            ll cost1=abs(w[c[j]]-x);
            ll cost2=abs(w[d[k]]-x);
            if(cost1<cost2)
            {
                ans+=unite(u[c[j]],v[c[j]])*abs(w[c[j]]-x);
                j++;
            }
            else
            {
                ans+=unite(u[d[k]],v[d[k]])*abs(w[d[k]]-x);
                k++;
            }
        }
        cout << ans << '\n';
    }
}
int main()
{
    fastio
    //freopen(TASKNAME".INP","r",stdin);
    //freopen(TASKNAME".OUT","w",stdout);
    solve();
}

컴파일 시 표준 에러 (stderr) 메시지

reconstruction.cpp: In function 'void solve()':
reconstruction.cpp:57:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   57 |         for(int j=0;j<a.size();j++)
      |                     ~^~~~~~~~~
reconstruction.cpp:63:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   63 |         for(int j=0;j<b.size();j++)
      |                     ~^~~~~~~~~
reconstruction.cpp:72:17: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   72 |             if(j==c.size())
      |                ~^~~~~~~~~~
reconstruction.cpp:78:17: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   78 |             if(k==d.size())
      |                ~^~~~~~~~~~
#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...