제출 #1147996

#제출 시각아이디문제언어결과실행 시간메모리
1147996raphaelpAncient Books (IOI17_books)C++20
0 / 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)] = R[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]]; while (pos != 0) { ans += 2; pos = L[group[pos - 1]]; } pos = R[group[s]]; while (pos != N - 1) { 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...