제출 #1147999

#제출 시각아이디문제언어결과실행 시간메모리
1147999raphaelp고대 책들 (IOI17_books)C++20
12 / 100
0 ms328 KiB
#include <bits/stdc++.h> #include "books.h" using namespace std; int find(int x, vector<int> &p) { return (x == p[x]) ? x : p[x] = find(p[x], p); } void search(int x, vector<int> &group, vector<int> &L, vector<int> &R, vector<int> &occ, vector<int> &P, vector<int> &Tab, int &cur) { occ[x] = 1; int until = R[x]; while (cur <= until) { if (find(group[Tab[cur]], P) == find(x, P)) { cur++; continue; } if (R[find(group[Tab[cur]], P)] > until) { R[find(x, P)] = max(R[find(x, P)], R[find(group[Tab[cur]], P)]); L[find(x, P)] = min(L[find(x, P)], L[find(group[Tab[cur]], P)]); P[find(group[Tab[cur]], P)] = find(x, P); until = R[find(x, P)]; cur++; } else { search(group[Tab[cur]], group, L, R, occ, P, Tab, cur); } } } long long minimum_walk(vector<int> p, int s) { int N = p.size(); long long ans = 0; vector<int> group(N), occ(N), L, R, P; int buff = 0; for (int i = 0; i < N; i++) { if (occ[i]) continue; P.push_back(buff); int x = i; occ[x] = 1; group[x] = buff; ans += abs(p[x] - x); x = p[x]; L.push_back(i); int maxx = i; while (x != i) { maxx = max(maxx, x); occ[x] = 1; group[x] = buff; ans += abs(p[x] - x); x = p[x]; } R.push_back(maxx); buff++; } occ.assign(buff, 0); int cur = 0; for (int i = 0; i < N; i++) { if (occ[find(group[i], P)]) continue; search(group[i], group, L, R, occ, P, p, cur); } for (int i = 0; i < N; i++) group[i] = find(group[i], P); int pos = L[group[s]]; int l = 0, r = N - 1; while (l < N && p[l] == l) l++; while (r >= 0 && p[r] == r) r--; while (pos > l) { ans += 2; pos = L[group[pos - 1]]; } pos = R[group[s]]; while (pos < r) { ans += 2; pos = R[group[pos + 1]]; } 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...