제출 #641488

#제출 시각아이디문제언어결과실행 시간메모리
641488ggoh고대 책들 (IOI17_books)C++14
50 / 100
271 ms90296 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; for(int i=1;i<=sz;i++) { ans+=cost[i]; sort(cycle[i].begin(),cycle[i].end()); d[cycle[i][0]]++; d[cycle[i][sz(cycle[i])-1]]--; if(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]) { le[i]=-1e9;ri[i]=1e9; for(auto &k:cycle[i]) { if(k<=s)le[i]=max(le[i],k); if(k>=s)ri[i]=min(ri[i],k); } } } else le[i]=ri[i]=s; }/* if(s!=0) { int cnt=0,tmp=1e9; for(int i=0;i<=s;i++) { for(int j=s;j<n;j++) { for(int k=1;k<=sz;k++) { if(le[k]>=i || ri[k]<=j)cnt++; } if(cnt==sz) { tmp=min(tmp,j-i); } } } 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...