제출 #292900

#제출 시각아이디문제언어결과실행 시간메모리
292900Kastanda고대 책들 (IOI17_books)C++11
50 / 100
542 ms75116 KiB
// M #include<bits/stdc++.h> #include "books.h" using namespace std; typedef long long ll; const int N = 1000006; int n, st, P[N], A[N], mn[N], mx[N]; int Find(int v) { return (P[v] < 0 ? v : (P[v] = Find(P[v]))); } inline void Merge(int v, int u) { v = Find(v); u = Find(u); if (v == u) return ; P[u] = v; mn[v] = min(mn[v], mn[u]); mx[v] = max(mx[v], mx[u]); } long long minimum_walk(vector < int > _A, int _st) { n = (int)_A.size(); st = _st + 1; for (int i = 1; i <= n; i ++) A[i] = _A[i - 1] + 1; ll SM = 0, tot = 0; for (int i = 1; i <= n; i ++) SM += abs(A[i] - i); memset(P, -1, sizeof(P)); for (int i = 1; i <= n; i ++) mn[i] = mx[i] = i; set < int > ST; for (int i = 1; i <= n; i ++) ST.insert(i); for (int i = 1; i <= n; i ++) if (i != A[i]) { int l = min(i, A[i]); int r = max(i, A[i]); auto it = ST.lower_bound(l); while (it != ST.end() && * it < r) Merge(* it, (* it) + 1), it = ST.erase(it); } vector < pair < int , int > > vec; for (int i = 1; i <= n; i ++) if (Find(i) == i && i != A[i]) vec.push_back({mn[i], mx[i]}); sort(vec.begin(), vec.end()); while (vec.size() > 1 && vec[(int)vec.size() - 2].second >= st) tot += vec.back().first - vec[(int)vec.size() - 2].second, vec.pop_back(); if (vec.size() && vec.back().first >= st) tot += vec.back().first - st, vec.pop_back(); reverse(vec.begin(), vec.end()); while (vec.size() > 1 && vec[(int)vec.size() - 2].first <= st) tot += vec[(int)vec.size() - 2].first - vec.back().second, vec.pop_back(); if (vec.size() && vec.back().second <= st) tot += st - vec.back().second, vec.pop_back(); if (vec.size()) assert(vec.size() == 1 && vec[0].first <= st && st <= vec[0].second); tot = tot * 2 + SM; return tot; }
#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...