제출 #1227632

#제출 시각아이디문제언어결과실행 시간메모리
1227632The_Samurai고대 책들 (IOI17_books)C++20
22 / 100
330 ms55088 KiB
#include "books.h" #include "bits/stdc++.h" using namespace std; struct dsu { vector<vector<int>> childs; vector<int> par; void init(int n) { childs.assign(n, {}); par.assign(n, 0); for (int i = 0; i < n; i++) par[i] = i, childs[i].emplace_back(i); } int get(int a) { return par[a]; } void merge(int a, int b) { if (par[a] == par[b]) return; a = par[a]; b = par[b]; if (childs[a].size() < childs[b].size()) swap(a, b); for (int x: childs[b]) { par[x] = a; childs[a].emplace_back(x); } childs[b].clear(); } }; long long minimum_walk(std::vector<int> p, int s) { int n = p.size(); int until = n - 1; while (until >= 0 and p[until] == until) until--; int exp = 0; for (int i = 0; i <= until; i++) exp += abs(p[i] - i); if (until < 0) return 0; exp -= 2; set<int> st; for (int i = 0; i < n; i++) st.insert(i); for (int i = 0; i <= until; i++) { exp += 2; int mx = i; st.erase(i); vector<int> vec = {i}; for (int j = 0; j < vec.size(); j++) { mx = max(mx, vec[j]); while (true) { auto it = st.lower_bound(vec[j]); if (it == st.end() or *it > p[vec[j]]) break; vec.emplace_back(*it); st.erase(it); } } i = mx; } return exp; }
#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...