Submission #109505

#TimeUsernameProblemLanguageResultExecution timeMemory
109505JustasZAncient Books (IOI17_books)C++14
50 / 100
317 ms85128 KiB
#include "books.h" #include <bits/stdc++.h> #define pb push_back #define x first #define y second #define all(a) a.begin(), a.end() #define sz(a) (int)a.size() #define rd() abs((int)rng()) using namespace std; typedef long long ll; typedef long double ld; typedef pair<int, int> pii; const int maxn = 1e6 + 100; const int mod = 1e9 + 7; mt19937 rng(chrono::high_resolution_clock::now().time_since_epoch().count()); int n, s, val[maxn], nxt, L[maxn], R[maxn]; ll base, add; vector<int>p; ll minimum_walk(vector<int>perm, int S) { p = perm; s = S; n = sz(p); for(int i = 1; i <= n; i++) L[i] = mod, R[i] = -mod; while(n > 0 && p[n - 1] == n - 1) --n; for(int i = 0; i < n; i++) { if(val[i] == 0) { int col = ++nxt, cur = i; while(val[cur] == 0) { val[cur] = col; L[col] = min(L[col], cur); R[col] = max(R[col], cur); base += abs(p[cur] - cur); cur = p[cur]; } } } vector<int>ends[n]; for(int i = 1; i <= nxt; i++) { ends[L[i]].pb(+1); ends[R[i]].pb(-1); } int open = 0; for(int i = 0; i < n; i++) { for(int d : ends[i]) open += d; if(i != n - 1 && open == 0) add++; } return base + add * 2; } /*int main() { ios_base::sync_with_stdio(false), cin.tie(0); vector<int>perm; ifstream fin("in.txt"); int n, s; fin >> n >> s; perm.resize(n); for(int i = 0; i < n; i++) fin >> perm[i]; cout << minimum_walk(perm, s) << endl; return 0; }*/
#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...