제출 #337703

#제출 시각아이디문제언어결과실행 시간메모리
337703pit4h고대 책들 (IOI17_books)C++14
50 / 100
183 ms35948 KiB
#include "books.h" #include "bits/stdc++.h" using namespace std; using ll = long long; ll solve(vector<int> p, int force) { int n = p.size(), s = 0, t = n-1; while(s+1<=force && p[s]==s) s++; while(t-1>=force && p[t]==t) t--; ll ans = 0; vector<int> cnt(n), L(n), R(n); for(int i=s; i<=t; ++i) { if(p[i] > i) cnt[i]++, cnt[p[i]]--; } int delta = 0; for(int i=s; i<=t; ++i) { delta += cnt[i]; L[i] = delta; } cnt = vector<int>(n, 0); for(int i=s; i<=t; ++i) { if(p[i] < i) { cnt[i-1]++; if(p[i]-1>=0) cnt[p[i]-1]--; } } delta = 0; for(int i=t; i>=s; --i) { delta += cnt[i]; R[i] = delta; } for(int i=s; i<t; ++i) { ans += max(2, max(L[i], R[i])*2); } return ans; } ll minimum_walk(vector<int> p, int s) { int n = p.size(); vector<int> pref(n), suf(n); pref[0] = p[0], suf[n-1] = p[n-1]; for(int i=1; i<n; ++i) { pref[i] = max(pref[i-1], p[i]); } for(int i=n-2; i>=0; --i) { suf[i] = min(suf[i+1], p[i]); } if(s==0 || p[s]!=s || (pref[s-1]<s && suf[s-1]>s)) { return solve(p, s); } ll ans = 1e18+1; vector<int> q = p; for(int i=0; i<n; ++i) { if(i==s) continue; q[i] = s; q[s] = p[i]; ans = min(ans, solve(q, s)); q[i] = p[i]; q[s] = p[s]; } 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...