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>
using namespace std;
typedef long long int lld;
lld n;
lld minimum_walk(vector<int> p, int s){
n = (lld) p.size();
lld ans = 0;
for(lld i=0;i<n;i++) ans+=abs(p[i]-i);
vector<bool> vis(n, false);
vector<vector<lld>> cycles;
vector<pair<lld,lld>> evs;
for(lld i=0;i<n;i++){
if(!vis[i]){
vector<lld> tmp;
lld x = i;
while(true){
if(vis[x]) break;
tmp.push_back(x);
vis[x] = true;
x = p[x];
}
cycles.push_back(tmp);
sort(tmp.begin(), tmp.end());
evs.push_back({tmp[0], 0});
evs.push_back({*tmp.rbegin(), 1});
}
}
sort(evs.begin(), evs.end());
lld op = 0;
vector<pair<lld,lld>> blocks;
lld beg = 0;
for(lld i=0;i<(lld)evs.size();i++){
if(evs[i].second==0){
if(op==0) beg = evs[i].first;
op++;
}else{
op--;
if(op==0) blocks.push_back({beg,evs[i].first});
}
}
while((lld)blocks.size()>0&&blocks.rbegin()->second==blocks.rbegin()->first) blocks.pop_back();
for(lld i=1;i<(lld)blocks.size();i++){
ans += 2*(blocks[i].first-blocks[i-1].second);
}
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... |