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 "bits/stdc++.h"
using namespace std;
vector<int> P;
int vis[1000001];
int vis2[1000001];
int L[1000001];
int R[1000001];
int mn = 1e9 ,mx = -1e9;
void dfs(int i){
vis[i] = 1;
mn = min(mn,i);
mx = max(mx,i);
if(!vis[P[i]])dfs(P[i]);
}
void DFS(int i){
L[i] = mn;
R[i] = mx;
vis2[i] = 1;
if(!vis2[P[i]])DFS(P[i]);
}
void extend(int &l,int &r){
int mnl = l;
int mnr = r;
mnl = min({mnl,L[l],L[r]});
mnr = max({mnr,R[r],R[l]});
while(l>mnl||r<mnr){
if(l>mnl){
l--;
mnl = min(mnl,L[l]);
mnr = max(mnr,R[l]);
}else{
r++;
mnl = min(mnl,L[r]);
mnr = max(mnr,R[r]);
}
}
}
int get(int l,int r,int targl,int targr){
extend(l,r);
int all = 0;
while(l>targl||r<targr){
extend(l,r);
int lL = l;
int rL = r;
int cost1 = 0 , cost2 = 0;
bool found1 = 0 , found2 = 0;
while(lL>=targl){
extend(lL,rL);
if(rL>r){found1 = 1;break;}
if(lL==targl){
break;
}
cost1+=2;
lL--;
}
int lR = l;
int rR = r;
while(rR<=targr){
extend(lR,rR);
if(lR<l){found2 = 1;break;}
if(rR==targr){
break;
}
cost2+=2;
rR++;
}
if(found1&&found2){
all+=min(cost1,cost2);
}else{
all+=cost1+cost2;
}
l = min({l,lL,lR});
r = max({r,rL,rR});
}
return all;
}
long long minimum_walk(vector<int> p, int s){
long long ans = 0;
int n = p.size();
P.clear();
for(int i = 0;i<n;i++){
vis[i] = 0;vis2[i] = 0;
P.push_back(p[i]);
ans+=abs(i-p[i]);
}
vector<pair<int,int>> lol;
int rngl = s;
int rngr = s;
for(int i = 0;i<n;i++){
if(!vis[i]){
mn = 1e9 , mx = -1e9;
dfs(i);
DFS(i);
if(i!=P[i]){
rngl = min(rngl,mn);
rngr = max(rngr,mx);
}
}
}
ans+=get(s,s,rngl,rngr);
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... |