제출 #1199425

#제출 시각아이디문제언어결과실행 시간메모리
1199425Hanksburger고대 책들 (IOI17_books)C++17
0 / 100
0 ms328 KiB
#include "books.h"
#include <bits/stdc++.h>
#define ll long long
using namespace std;
vector<pair<ll, pair<ll, ll> > > edges;
ll comp[1000005], sz[1000005], par[1000005], n, cnt, ind=-1, ans;
ll findPar(ll u)
{
    return par[u]==u?u:par[u]=findPar(par[u]);
}
ll minimum_walk(vector<int> a, int s)
{
    n=a.size();
    for (ll i=0; i<n; i++)
    {
        ans+=abs(a[i]-i);
        if (comp[i] || (i!=s && a[i]==i))
            continue;
        cnt++;
        ll cur=i;
        while (!comp[cur])
        {
            comp[cur]=cnt;
            sz[cnt]++;
            cur=a[cur];
        }
    }
    for (ll i=0; i<n; i++)
    {
        if (!comp[i])
            continue;
        if (ind!=-1 && comp[ind]!=comp[i])
            edges.push_back({i-ind, {comp[ind], comp[i]}});
        ind=i;
    }
    sort(edges.begin(), edges.end());
    for (ll i=1; i<=cnt; i++)
        par[i]=i;
    for (auto edge:edges)
    {
        ll u=edge.second.first, v=edge.second.second, w=edge.first;
        if (findPar(u)!=findPar(v))
        {
            ans+=w*2;
            par[findPar(u)]=findPar(v);
        }
    }
    return ans;
}
#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...