Submission #99218

#TimeUsernameProblemLanguageResultExecution timeMemory
99218eriksuenderhaufAncient Books (IOI17_books)C++11
100 / 100
330 ms26744 KiB
#include <bits/stdc++.h> #include "books.h" using namespace std; typedef long long ll; const int MAXN = 1e6 + 50; int L[MAXN], R[MAXN], vis1[MAXN], vis2[MAXN]; int ind[MAXN]; void ext(int& l, int& r) { int mL = min(l, min(L[ind[l]], L[ind[r]])); int mR = max(r, max(R[ind[l]], R[ind[r]])); while (mL < l || r < mR) { if (mL < l) { l--; mL = min(mL, L[ind[l]]); mR = max(mR, R[ind[l]]); } else { r++; mL = min(mL, L[ind[r]]); mR = max(mR, R[ind[r]]); } } } ll minimum_walk(vector<int> p, int s) { int n = p.size(); if (s != 0) { ll ret = 0; int l = s, r = s, c = 0; for (int i = 0; i < n; i++) ind[i] = -1; for (int i = 0; i < n; i++) { ret += (ll) abs(p[i] - i); if (ind[i] != -1) continue; int j = i; L[c] = i, R[c] = i; do { ind[j] = c; // L[c] = min(L[c], j); R[c] = max(R[c], j); j = p[j]; } while(i != j); if (i != p[i]) l = min(l, L[c]), r = max(r, R[c]); c++; } int curL = s, curR = s; do { ext(curL, curR); int c1 = 0, c2 = 0; int mL1 = curL, mR1 = curR; int f1 = 0, f2 = 0; while (l < mL1) { mL1--; c1 += 2; ext(mL1, mR1); if (mR1 > curR) { f1 = true; break; } } int mL2 = curL, mR2 = curR; while (mR2 < r) { mR2++; c2 += 2; ext(mL2, mR2); if (mL2 < curL) { f2 = true; break; } } if (f1 && f2) ret += min(c1, c2); else ret += c1 + c2; curL = min(mL1, mL2); curR = max(mR1, mR2); } while (l < curL || curR < r); return ret; } ll ret = 0; ll sum = 0; vis1[0] = 1; vis2[n] = 0; for (int i = 1; i < n; i++) vis1[i] = vis1[i-1] | (p[i] != i); for (int i = n - 1; i > 0; i--) vis2[i] = vis2[i + 1] | (p[i] != i); for (int i = 0; i < n; i++) { ret += (ll) abs(p[i] - i); sum += (ll) p[i]; if (sum * 2 == 1ll * (ll) i * (1ll * (ll) i + 1) && i != n - 1 && vis1[i] && vis2[i + 1]) ret += 2; } return ret; }
#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...