Submission #893217

#TimeUsernameProblemLanguageResultExecution timeMemory
893217vjudge1Ancient Books (IOI17_books)C++17
0 / 100
1 ms348 KiB
#include "books.h" #include <bits/stdc++.h> using namespace std; using ll = long long; using vll = vector<ll>; using vi = vector<int>; using ii = pair<int, int>; struct UF { vi e; UF(int N) : e(N, -1) {} int repr(int u) { while(e[u] >= 0) u = e[u]; return u; } int join(int u, int v) { u = repr(u); v = repr(v); if(u == v) return 0; if(e[u] >= e[v]) swap(u, v); e[u] += e[v]; e[v] = u; return 1; } }; long long minimum_walk(vi p, int s) { int n = p.size(); ll re = 0; for(int i = 0; i < n; ++i) re += abs(i - p[i]); vi cul(n, 0), viz(n, 0), alb(n, 0); int nrcic = 0; for(int i = 0; i < n; ++i) { if(!viz[i]) { int u = i; while(!viz[u]) { viz[u] = 1; cul[u] = nrcic; u = p[u]; } if(i == p[i]) alb[nrcic] = 1; ++nrcic; } } alb.resize(nrcic); alb[cul[s]] = 0; vector<vi> L(nrcic); for(int i = 0; i + 1 < n; ++i) { if(cul[i] != cul[i + 1]) { L[cul[i]].push_back(cul[i + 1]); L[cul[i + 1]].push_back(cul[i]); } } viz.assign(nrcic, 0); function<void(int, vi&, int&)> dfs0 = [&](int u, vi &V, int&cnt) { viz[u] = 1; ++cnt; for(auto it : L[u]) { if(!viz[it] && alb[it]) { dfs0(it, V, cnt); } else if(!viz[it] && !alb[it]) { V.push_back(it); } } }; vector<pair<int, ii> > E; for(int i = 0; i < nrcic; ++i) { if(alb[i] && !viz[i]) { vi vec; int cnt = 0; dfs0(i, vec, cnt); assert(vec.size() <= 2); if(vec.size() == 2) { int u = vec[0], v = vec[1]; printf("(%d %d %d)\n", u, v, cnt); E.push_back({cnt, ii{u, v}}); } } } for(int i = 0; i < nrcic; ++i) for(auto it : L[i]) { if(!alb[i] && !alb[it]) E.push_back({0, ii{i, it}}); } sort(E.begin(), E.end()); UF Sol(nrcic); for(auto [w, muchie] : E) { auto [u, v] = muchie; if(Sol.join(u, v)) { re += (w + 1) * 2; } } return re; }
#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...