Submission #1199523

#TimeUsernameProblemLanguageResultExecution timeMemory
1199523Aviansh고대 책들 (IOI17_books)C++20
50 / 100
112 ms19784 KiB
#include "books.h" #include <bits/stdc++.h> using namespace std; struct dsu{ vector<int>root; vector<int>siz; vector<int>maxima; dsu(int n){ maxima=vector<int>(n); iota(maxima.begin(),maxima.end(),0); root=vector<int>(n); iota(root.begin(),root.end(),0); siz=vector<int>(n,1); } bool unite(int x, int y){ x=findRoot(x); y=findRoot(y); if(x==y) return 0; if(siz[x]<siz[y]){ swap(x,y); } siz[x]+=siz[y]; root[y]=x; maxima[x]=max(maxima[x],maxima[y]); return 1; } int findRoot(int x){ if(x==root[x]) return x; return root[x]=findRoot(root[x]); } }; long long minimum_walk(vector<int> p, int s) { long long ans = 0; int n = p.size(); dsu ds(n); for(int i = 0;i<n;i++){ ans+=abs(i-p[i]); ds.unite(i,p[i]); } assert(s==0); int mxreach = ds.maxima[0]; for(int i = 0;i<n;i++){ if(i!=p[i]){ if(mxreach<i){ ans+=2*(i-mxreach); } mxreach=max(mxreach,ds.maxima[ds.findRoot(i)]); ds.unite(0,i); } } 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...