제출 #353360

#제출 시각아이디문제언어결과실행 시간메모리
353360dolphingarlic고대 책들 (IOI17_books)C++14
100 / 100
228 ms77548 KiB
#include "books.h" #include <bits/stdc++.h> typedef long long ll; using namespace std; int crit_l, crit_r; int cmp[1000000], cmp_l[1000000], cmp_r[1000000]; void extend(int &l, int &r) { int ext_l = min(cmp_l[cmp[l]], cmp_l[cmp[r]]); int ext_r = max(cmp_r[cmp[l]], cmp_r[cmp[r]]); while (l != ext_l || r != ext_r) { if (l != ext_l) { l--; ext_l = min(ext_l, cmp_l[cmp[l]]); ext_r = max(ext_r, cmp_r[cmp[l]]); } else { r++; ext_l = min(ext_l, cmp_l[cmp[r]]); ext_r = max(ext_r, cmp_r[cmp[r]]); } } } ll compute(int l, int r) { extend(l, r); if (l == crit_l && r == crit_r) return 0; if (l == crit_l) return compute(l, r + 1) + 2; if (r == crit_r) return compute(l - 1, r) + 2; ll to_l = 2; int nl = l - 1, nr = r, tl = l, tr = r + 1; extend(nl, nr), extend(tl, tr); while (nl != crit_l && nr < tr) { to_l += 2; nl--; extend(nl, nr); } if (nr < tr) return to_l + compute(nl, nr); ll to_r = 2; nl = l, nr = r + 1, tl = l - 1, tr = r; extend(nl, nr), extend(tl, tr); while (nl > tl) { to_r += 2; nr++; extend(nl, nr); } return min(to_l, to_r) + compute(nl, nr); } ll minimum_walk(vector<int> p, int s) { int n = p.size(), cmp_cnt = 0; fill(cmp, cmp + n, -1); crit_l = s, crit_r = s; ll intra = 0; for (int i = 0; i < n; i++) { intra += abs(p[i] - i); if (cmp[i] == -1) { int curr = i; cmp_l[cmp_cnt] = cmp_r[cmp_cnt] = i; do { cmp[curr] = cmp_cnt; cmp_r[cmp_cnt] = max(cmp_r[cmp_cnt], curr); curr = p[curr]; } while (curr != i); if (i != p[i]) { crit_l = min(crit_l, cmp_l[cmp_cnt]); crit_r = max(crit_r, cmp_r[cmp_cnt]); } cmp_cnt++; } } return intra + compute(s, s); }
#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...