제출 #641494

#제출 시각아이디문제언어결과실행 시간메모리
641494ggoh고대 책들 (IOI17_books)C++14
50 / 100
267 ms82480 KiB
#include "books.h" #include<bits/stdc++.h> using namespace std; #define sz(v) ((int)(v).size()) typedef long long lint; int n,sz; int v[1000002]; int d[1000002]; int le[1000002],ri[1000002]; vector<int>go; vector<int>cycle[1000002]; lint cost[1000002]; void dfs(int p,int par) { cycle[sz].push_back(p); cost[sz]+=abs(par-p); v[p]=1; if(!v[go[p]])dfs(go[p],p); else cost[sz]+=abs(go[p]-p); } lint minimum_walk(vector<int> p, int s) { n=sz(p); go=p; for(int i=0;i<n;i++) { if(!v[i]) { sz++; dfs(i,i); } } vector<int>X; lint ans=0; int maxi=-1,mini=1e9,tmp=0; for(int i=1;i<=sz;i++) { if(sz(cycle[i])==1)continue; ans+=cost[i]; sort(cycle[i].begin(),cycle[i].end()); d[cycle[i][0]]++; d[cycle[i][sz(cycle[i])-1]]--; maxi=max(maxi,cycle[i][sz(cycle[i])-1]-1); mini=min(mini,cycle[i][0]); if(cycle[i][0]<s && s<cycle[i][sz(cycle[i])-1]) { int ch=0; for(auto &k:cycle[i]) { if(k==s) { ch=1;break; } } if(!ch) { for(auto &k:cycle[i]) { if(!tmp)tmp=abs(s-k); else tmp=min(tmp,abs(s-k)); } } } } ans+=2*tmp; int c=0; for(int i=0;i<n;i++) { c+=d[i]; d[i]=c; } if(s<=mini) { for(int i=s;i<=maxi;i++) { if(!d[i])ans+=2; } } else if(s>maxi) { for(int i=mini;i<s;i++) { if(!d[i])ans+=2; } } else { for(int i=mini;i<=maxi;i++) { if(!d[i])ans+=2; } } return ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...