제출 #748865

#제출 시각아이디문제언어결과실행 시간메모리
748865wenqi고대 책들 (IOI17_books)C++17
50 / 100
245 ms53052 KiB
#include "books.h" #include <algorithm> #include <cmath> #include <cstring> #include <queue> #include <set> using namespace std; using ll = long long; bool seen[1000005]; vector<int> P; vector<int> t; ll dfs(int i) { if (seen[i]) return 0; seen[i] = true; t.push_back(i); return abs(i - P[i]) + dfs(P[i]); } ll minimum_walk(vector<int> p, int s) { P = p; ll sum = 0; int n = p.size(); vector<pair<int, int>> q; q.push_back({s, s}); bool lol = false; for (int i = 0; i < n; i++) { if (seen[i] or i == p[i]) continue; t.clear(); sum += dfs(i); sort(t.begin(), t.end()); q.push_back({t.front(), t.back()}); auto [a, b] = q.back(); if (a <= s and s <= b) lol = true; } sort(q.begin(), q.end()); int lt = -1; for (auto [a, b] : q) { if (lt == -1) { lt = b; } if (a > lt) { sum += 2 * (a - lt); lt = b; } else { lt = max(lt, b); } } int mn = 1e9; for (int i = 0; i < n; i++) if (seen[i]) mn = min(mn, abs(i - s)); if (lol) sum += 2 * mn; return sum; }
#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...