Submission #892415

#TimeUsernameProblemLanguageResultExecution timeMemory
892415abcvuitunggioAncient Books (IOI17_books)C++17
22 / 100
2060 ms51140 KiB
#include "books.h" #include <bits/stdc++.h> using namespace std; int vis[1000001],l[1000001]; vector <pair <int, pair <int, int>>> e; vector <int> ve[1000001]; int f(int i){ return (l[i]==i?i:l[i]=f(l[i])); } int unite(int i, int j){ i=f(i); j=f(j); if (i==j) return 0; l[j]=i; return 1; } long long minimum_walk(vector <int> p, int s){ int x=0,n=p.size(); iota(l,l+n,0); long long d=0; for (int i=0;i<n;i++){ if (!vis[i]){ int x=i; while (true){ vis[x]=1; ve[i].push_back(x); d+=abs(x-p[x]); x=p[x]; if (x==i) break; } } } for (int i=0;i<n;i++) sort(ve[i].begin(),ve[i].end()); for (int i=0;i<n;i++) for (int j=0;j<n;j++){ if (i==j||ve[i].empty()||ve[j].empty()) continue; if (ve[i].size()==1&&i!=s) continue; if (ve[j].size()==1&&j!=s) continue; int mn=1e9; for (int k:ve[j]){ if (k>=ve[i][0]&&k<=ve[i].back()){ mn=0; break; } mn=min(mn,abs(k-ve[i][0])); mn=min(mn,abs(k-ve[i].back())); } e.push_back({mn,{i,j}}); } sort(e.begin(),e.end()); for (auto [i,j]:e) x+=i*unite(j.first,j.second); return x*2+d; }
#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...