This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "books.h"
#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
#define AquA cin.tie(0);ios_base::sync_with_stdio(0);
#define fs first
#define sc second
#define p_q priority_queue
using namespace std;
typedef long long ll;
struct DSU{
vector<int> bo;
void init(int x){
bo.resize(x);
iota(bo.begin(),bo.end(),0);
}
int find(int x){
return bo[x]==x?x:bo[x]=find(bo[x]);
}
int merge(int x,int y){
x=find(x);
y=find(y);
if(x==y){
return 0;
}
bo[x]=y;
return 1;
}
}dsu;
ll minimum_walk(vector<int> p, int s) {
ll ans=0;
int n=p.size();
dsu.init(n);
vector<int> bo(n,-1),k(n);
for(int i=0;i<n;i++){
if(bo[i]==-1){
int cnt=0;
for(int x=i;bo[x]==-1;x=p[x]){
bo[x]=i;
cnt++;
}
if(cnt>=2){
k[i]=1;
}
}
ans+=abs(i-p[i]);
}
k[s]=1;
int mn=-1;
vector<pair<int,pair<int,int> > > e;
for(int i=0;i<n;i++){
if(k[bo[i]]){
if(mn!=-1){
e.push_back({i-mn,{bo[i],bo[mn]}});
}
mn=i;
}
}
sort(e.begin(),e.end());
for(auto h:e){
ans+=2*dsu.merge(h.sc.fs,h.sc.sc)*h.fs;
}
return ans;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |