Submission #892412

#TimeUsernameProblemLanguageResultExecution timeMemory
892412abcvuitunggioAncient Books (IOI17_books)C++17
0 / 100
10 ms26196 KiB
#include "books.h"
#include <bits/stdc++.h>
using namespace std;
int vis[1000001],l[1000001];
vector <pair <int, pair <int, int>>> e;
vector <int> ve[1000001];
int f(int i){
    return (l[i]==i?i:l[i]=f(l[i]));
}
int unite(int i, int j){
    i=f(i);
    j=f(j);
    if (i==j)
        return 0;
    l[j]=i;
    return 1;
}
long long minimum_walk(vector <int> p, int s){
    int x=0,n=p.size();
    iota(l,l+n,0);
    long long d=0;
    for (int i=0;i<n;i++){
        if (!vis[i]){
            int x=i;
            while (true){
                vis[x]=1;
                ve[i].push_back(x);
                d+=abs(x-p[x]);
                x=p[x];
                if (x==i)
                    break;
            }
        }
    }
    for (int i=0;i<n;i++)
        sort(ve[i].begin(),ve[i].end());
    for (int i=0;i<n;i++)
        for (int j=0;j<n;j++){
            if (i==j||ve[i].size()<2||ve[j].size()<2)
                continue;
            int mn=1e9;
            for (int k:ve[j]){
                if (k>=ve[i][0]&&k<=ve[i].back()){
                    mn=0;
                    break;
                }
                mn=min(mn,abs(k-ve[i][0]));
                mn=min(mn,abs(k-ve[i].back()));
            }
            e.push_back({mn,{i,j}});
        }
    sort(e.begin(),e.end());
    for (auto [i,j]:e)
        x+=i*unite(j.first,j.second);
    return x*2+d;
}
#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...