|
#include "books.h" |
|
#include <bits/stdc++.h> |
|
#define fi first |
|
#define se second |
|
#define rep(i,n) for(int i = 0; i < (n); ++i) |
|
#define rrep(i,n) for(int i = 1; i <= (n); ++i) |
|
#define drep(i,n) for(int i = (n)-1; i >= 0; --i) |
|
#define each(it,c) for(__typeof((c).begin()) it=(c).begin();it!=(c).end();it++) |
|
#define rng(a) a.begin(),a.end() |
|
#define maxs(x,y) x = max(x,y) |
|
#define mins(x,y) x = min(x,y) |
|
#define pb push_back |
|
#define sz(x) (int)(x).size() |
|
#define pcnt __builtin_popcount |
|
#define uni(x) x.erase(unique(rng(x)),x.end()) |
|
#define snuke srand((unsigned)clock()+(unsigned)time(NULL)); |
|
#define df(x) int x = in() |
|
#define dame { puts("-1"); return 0;} |
|
#define show(x) cout<<#x<<" = "<<x<<endl; |
|
#define PQ(T) priority_queue<T,vector<T>,greater<T> > |
|
#define bn(x) ((1<<x)-1) |
|
#define newline puts("") |
|
#define v(T) vector<T> |
|
#define vv(T) vector<vector<T>> |
|
using namespace std; |
|
typedef long long int ll; |
|
typedef unsigned uint; |
|
typedef unsigned long long ull; |
|
typedef pair<int,int> P; |
|
typedef vector<int> vi; |
|
typedef vector<vi> vvi; |
|
typedef vector<ll> vl; |
|
typedef vector<P> vp; |
|
inline int in() { int x; scanf("%d",&x); return x;} |
|
inline void priv(vi a) { rep(i,sz(a)) printf("%d%c",a[i],i==sz(a)-1?'\n':' ');} |
|
template<typename T>istream& operator>>(istream&i,vector<T>&v) |
|
{rep(j,sz(v))i>>v[j];return i;} |
|
template<typename T>string join(const vector<T>&v) |
|
{stringstream s;rep(i,sz(v))s<<' '<<v[i];return s.str().substr(1);} |
|
template<typename T>ostream& operator<<(ostream&o,const vector<T>&v) |
|
{if(sz(v))o<<join(v);return o;} |
|
template<typename T1,typename T2>istream& operator>>(istream&i,pair<T1,T2>&v) |
|
{return i>>v.fi>>v.se;} |
|
template<typename T1,typename T2>ostream& operator<<(ostream&o,const pair<T1,T2>&v) |
|
{return o<<v.fi<<","<<v.se;} |
|
const int MX = 100005, INF = 1001001001; |
|
const ll LINF = 1e18; |
|
const double eps = 1e-10; |
|
|
|
ll minimum_walk(vi a, int si) { |
|
int n = sz(a); |
|
int li = si, ri = si; |
|
vi d(n+1); |
|
rep(i,n) { |
|
int l = i, r = a[i]; |
|
if (l == r) continue; |
|
if (l > r) swap(l,r); |
|
d[l]++; d[r]--; |
|
mins(li,l); |
|
maxs(ri,r); |
|
} |
|
rep(i,n) d[i+1] += d[i]; |
|
ll ans = 0; |
|
for (int i = li; i < ri; ++i) ans += max(2,d[i]); |
|
|
|
vi dist(n,INF); |
|
deque<P> q; |
|
dist[si] = 0; q.pb(P(0,si)); |
|
set<int> s; |
|
rep(i,n) s.insert(i); |
|
while (sz(q)) { |
|
int nd = q[0].fi, v = q[0].se; q.pop_front(); |
|
auto psh = [&](int u) { |
|
if (dist[u] <= nd+1) return; |
|
dist[u] = nd+1; |
|
q.pb(P(nd+1,u)); |
|
}; |
|
int l = min(v,a[v]); |
|
int r = max(v,a[v]); |
|
{ |
|
for (auto it = s.lower_bound(l); it != s.end() && *it <= r;) { |
|
int u = *it; |
|
dist[u] = nd; |
|
q.push_front(P(nd,u)); |
|
s.erase(it++); |
|
} |
|
} |
|
if (l && d[l-1]) psh(l-1); |
|
if (d[r]) psh(r+1); |
|
} |
|
int mx = 0; |
|
rep(i,n) if (dist[i] != INF) maxs(mx,dist[i]); |
|
ans += mx*2; |
|
return ans; |
|
} |