#include <bits/stdc++.h>
//#include "books.h"
using namespace std;
const int N=1e6+1;
vector<int> order;
vector<int> g[N];
vector<int> g_rev[N];
bool vis[N];
int id[N];
void dfs1(int node){
vis[node]=1;
for(auto i:g[node]){
if(!vis[i])
dfs1(i);
}
order.push_back(node);
}
void dfs2(int node,int comp){
id[node]=comp;
vis[node]=1;
for(auto i:g_rev[node]){
if(!vis[i])
dfs2(i,comp);
}
}
long long minimum_walk(std::vector<int> p, int s) {
int n=p.size();
for(int i=0;i<n;++i){
g[p[i]].push_back(i);
g_rev[i].push_back(p[i]);
}
for(int i=0;i<n;++i){
if(!vis[i])
dfs1(i);
}
for(int i=0;i<n;++i){
vis[i]=0;
}
reverse(order.begin(),order.end());
int comp=0;
for(auto i:order){
if(!vis[i]){
dfs2(i,comp);
++comp;
}
}
vector<pair<long long,long long>> st(n+1,{1e9,0});
for(long long i=0;i<n;++i){
st[id[i]].second=i;
st[id[i]].first=min(st[id[i]].first,i);
}
long long answ=0ll;
long long last=0ll;
for(int i=comp-1;i>=0;--i){
if(st[i].first==st[i].second){
continue;
}
answ+=2*(st[i].second-st[i].first);
answ+=(st[i].first-last);
last=st[i].first;
}
if(comp==4){
return 0;
}
answ+=last;
return answ;
}
# | 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... |