#include "books.h"
#include <bits/stdc++.h>
using namespace std;
struct dsu{
vector<int>root;
vector<int>siz;
vector<int>maxima;
dsu(int n){
maxima=vector<int>(n);
iota(maxima.begin(),maxima.end(),0);
root=vector<int>(n);
iota(root.begin(),root.end(),0);
siz=vector<int>(n,1);
}
bool unite(int x, int y){
x=findRoot(x);
y=findRoot(y);
if(x==y)
return 0;
if(siz[x]<siz[y]){
swap(x,y);
}
siz[x]+=siz[y];
root[y]=x;
maxima[x]=max(maxima[x],maxima[y]);
return 1;
}
int findRoot(int x){
if(x==root[x])
return x;
return root[x]=findRoot(root[x]);
}
};
long long minimum_walk(vector<int> p, int s) {
long long ans = 0;
int n = p.size();
dsu ds(n);
for(int i = 0;i<n;i++){
ans+=abs(i-p[i]);
ds.unite(i,p[i]);
}
assert(s==0);
int mxreach = ds.maxima[0];
for(int i = 0;i<n;i++){
if(i!=p[i]){
if(mxreach<i){
ans+=2*(i-mxreach);
}
mxreach=max(mxreach,ds.maxima[ds.findRoot(i)]);
ds.unite(0,i);
}
}
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... |