제출 #787812

#제출 시각아이디문제언어결과실행 시간메모리
787812QwertyPiAncient Books (IOI17_books)C++14
0 / 100
2044 ms312 KiB
#include "books.h" #include <bits/stdc++.h> using namespace std; const int MAXN = 1e6 + 11; struct range{ int l, r; bool extend(range rg){ bool changed = false; if(rg.l < l) changed = true, l = rg.l; if(rg.r > r) changed = true, r = rg.r; return changed; } friend bool operator!= (const range& s, const range& t){ return s.l != t.l || s.r != t.r; } }; bool vis[MAXN]; range cyc[MAXN]; long long minimum_walk(vector<int> p, int s) { int n = p.size(); long long ans = 0; for(int i = 0; i < n; i++){ ans += abs(p[i] - i); } for(int i = 0; i < n; i++){ if(!vis[i]){ vector<int> c = {i}; int x = p[i]; range r = {i, i}; while(x != c[0]){ r.extend({x, x}); c.push_back(x); vis[x] = true; x = p[x]; } for(auto j : c) cyc[j] = r; } } for(int i = s - 1; i >= 0; i--){ cyc[i].extend(cyc[i + 1]); } for(int i = s + 1; i < n; i++){ cyc[i].extend(cyc[i - 1]); } { range cur = cyc[s], nxt; do{ nxt = cur; nxt.extend(cyc[nxt.l]); nxt.extend(cyc[nxt.r]); }while(cur != nxt); cyc[s] = nxt; } for(int i = s - 1; i >= 0; i--){ cyc[i].extend(cyc[i + 1]); range cur = cyc[i], nxt; do{ nxt = cur; nxt.extend(cyc[nxt.l]); nxt.extend(cyc[nxt.r]); }while(cur != nxt); cyc[i] = nxt; } for(int i = s + 1; i < n; i++){ cyc[i].extend(cyc[i - 1]); range cur = cyc[i], nxt; do{ nxt = cur; nxt.extend(cyc[nxt.l]); nxt.extend(cyc[nxt.r]); }while(cur != nxt); cyc[i] = nxt; } int c = 0; while(cyc[c].r != n - 1){ c = cyc[c].r; ++c; ans += 2; } 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...