#include // clang-format off using namespace std;constexpr int INF=1001001001;constexpr long long INFll=1001001001001001001;namespace viewer{using s=string;templates f(T i){s S=i==INF||i==INFll?"inf":to_string(i);return s(max(0,3-int(S.size())),' ')+S;} templateauto v(T&x,s&&e)->decltype(cerr<void v(const pair&p,s&&e="\n"){cerr<<"(";v(p.first,", ");v(p.second,")"+e);}templatevoid v(const tuple&t,s&&e="\n"){cerr<<"(";v(get<0>(t),", ");v(get<1>(t),")"+e);}templatevoid v(const tuple&t,s&&e="\n"){cerr<<"(";v(get<0>(t),", ");v(get<1>(t),", ");v(get<2>(t),")"+e);}templatevoid v(const tuple&t,s&&e="\n"){cerr<<"(";v(get<0>(t),", ");v(get<1>(t),", ");v(get<2>(t),", ");v(get<3>(t),")"+e);} templatevoid v(const vector&vx,s);templateauto ve(int,const vector&vx)->decltype(cerr<auto ve(bool,const vector&vx){cerr<<"{\n";for(const T&x:vx)cerr<<" ",v(x,",");cerr<<"}\n";}templatevoid v(const vector&vx,s){ve(0,vx);} templatevoid v(const deque&q,s&&e){v(vector(q.begin(),q.end()),e);}templatevoid v(const set&S,s&&e){v(vector(S.begin(),S.end()),e);}templatevoid v(const multiset&S,s&&e){v(vector(S.begin(),S.end()),e);}templatevoid v(const unordered_set&S,s&&e){v(vector(S.begin(),S.end()),e);} templatevoid v(const priority_queue&p,s&&e){priority_queueq=p;vectorz;while(!q.empty()){z.push_back(q.top());q.pop();}v(z,e);}templatevoid v(const map&m,s&&e){cerr<<"{"<<(m.empty()?"":"\n");for(const auto&kv:m){cerr<<" [";v(kv.first,"");cerr<<"] : ";v(kv.second,"");cerr<<"\n";}cerr<<"}"+e;} templatevoid _view(int n,s&S,T&var){cerr<<"\033[1;32m"<void grid(T _){}void grid(const vector>&vvb){cerr<<"\n";for(const vector&vb:vvb){for(const bool&b:vb)cerr<<(b?".":"#");cerr<<"\n";}} void _debug(int,s){}templatevoid _debug(int n,s S,const H&h,const T&... t){int i=0,cnt=0;for(;iap;mint re=a;for(long long r=1;r struct fenwick_tree { fenwick_tree() : _n(0) {} explicit fenwick_tree(int n) : _n(n), data(n) {} explicit fenwick_tree(vector& As) : _n(As.size()), data(As) {} // A[idx]+=x void add(int idx, T x) { assert(0 <= idx && idx < _n); idx++; while (idx <= _n) { data[idx - 1] += x; idx += idx & -idx; } } // Σ_[l,r) T sum(int l, int r) const { assert(0 <= l && l <= r && r <= _n); return _sum(r) - _sum(l); } // Σ_[0,r) T sum(int r) const { assert(0 <= r && r <= _n); return _sum(r); } // A[idx] O(logN) T get(int idx) const { assert(0 <= idx && idx < _n); return sum(idx, idx + 1); } // debug vector state() const { vector ret(_n); for (int i = 0; i < _n; i++) ret[i] = get(i); return ret; } inline T operator[](int idx) const { return get(idx); } private: int _n; vector data; T _sum(int r) const { T s = 0; while (r > 0) s += data[r - 1], r -= r & -r; return s; } }; template // https://onlinejudge.u-aizu.ac.jp/problems/ALDS1_5_D long long inversion_number(const vector& As) { vector Bs = As, Xs(As.size()); sort(Bs.begin(), Bs.end()); Bs.erase(unique(Bs.begin(), Bs.end()), Bs.end()); assert(Bs.size() == As.size()); for (int i = 0; i < (int)As.size(); i++) Xs[i] = lower_bound(Bs.begin(), Bs.end(), As[i]) - Bs.begin(); int N = Xs.size(); long long ret = 0; fenwick_tree f(N); for (int j = 0; j < N; j++) { ret += j - f.sum(Xs[j]); f.add(Xs[j], 1); } return ret; } long long f(vector& As, vector& Bs) { map m; for (int i = 0; i < int(As.size()); i++) { m[As[i]] = i; } vector Cs(As.size()); for (int i = 0; i < int(As.size()); i++) { Cs[i] = m[Bs[i]]; } debug(Cs); return inversion_number(Cs); } int main() { cin.tie(0); ios::sync_with_stdio(false); int N; cin >> N; vector As(N); for (int i = 0; i < N; i++) { cin >> As[i]; } int X = N / 2; vector sm; vector la; for (int i = 0; i < N; i++) { if (As[i] <= X) { sm.push_back(As[i]); } else { la.push_back(As[i]); } } assert(int(sm.size()) == N / 2); assert(int(la.size()) == (N + 1) / 2); vector Bs(N); for (int i = 0; i < N; i++) { Bs[i] = (i % 2 == 1 ? sm[i / 2] : la[i / 2]); } long long Y = f(As, Bs); if (N % 2 == 0) { for (int i = 0; i < N; i++) { Bs[i] = (i % 2 == 0 ? sm[i / 2] : la[i / 2]); } chmin(Y, f(As, Bs)); } cout << X << " " << Y << endl; return 0; }