Submission #423685

#TimeUsernameProblemLanguageResultExecution timeMemory
423685arayiAncient Books (IOI17_books)C++17
50 / 100
255 ms39788 KiB
#include "books.h" #include <bits/stdc++.h> #define lli long long #define ad push_back #define fr first #define sc second #define MP make_pair using namespace std; const int N = 1e6 + 30; int i1 = 1, ii, n; int col[N], a[N], cl[N]; int mn[N], mx[N], m[N], x[N]; lli ans; int dfs(int v) { col[v] = i1; cl[v] = ii; mn[ii] = min(mn[ii], v), m[i1] = min(m[i1], v); mx[ii] = max(mx[ii], v), x[i1] = max(x[i1], v); if(!col[a[v]]) return max(v, dfs(a[v])); return v; } long long minimum_walk(vector<int> p, int s) { n = p.size(); for(int i = 0; i < n; i++) a[i] = p[i], ans += abs(a[i] - i), mn[i] = m[i] = n; int nx = -1; for(int i = 0; i < n; i++) { if(a[i] == i) continue; if(!col[i]) { if(nx >= 0 && i > nx) ans += 2*(i - nx), i1++; ii++; nx = max(nx, dfs(i)); } } int dz = -1, aj = -1; for(int i = s; i < n; i++) { if(col[i]) { aj = i; break; } } for(int i = s; i >= 0; i--) { if(col[i]) { dz = i; break; } } if(dz == -1 && aj == -1) return ans; else if(dz == -1) ans += 2*abs(aj - s); else if(aj == -1) ans += 2*abs(s - dz); else if(col[aj] == col[dz]) { int sm = 0; int i = s, nx = s; while(nx < x[col[aj]]) { if(cl[i]) nx = max(nx, mx[cl[i]]); i++; if(i > nx) sm++, nx = i; } int ss = 0; i = s, nx = s; while(nx > m[col[aj]]) { if(cl[i]) nx = min(nx, mn[cl[i]]); i--; if(i < nx) ss++, nx = i; } ans += 2*min(ss, sm); //cout << s << " " << sm << endl; } 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...