怪异变换题
题号:NC308102
时间限制:C/C++/Rust/Pascal 2秒,其他语言4秒
空间限制:C/C++/Rust/Pascal 512 M,其他语言1024 M
64bit IO Format: %lld

题目描述

\hspace{15pt}给你一个长 2^n02^{n}-1 的排列 a_1,a_2,\dots,a_{2^n},你可以进行以下操作:
\hspace{23pt}\bullet\,选择整数 1\le i<2^n0\le j<n,交换 a_ia_{i+1} 的从低到高第 j+1 个二进制位(从右往左,下标从 0 开始,位权为 2^j 的二进制位)。
\hspace{15pt}例如,若 a_1=(100111)_2,a_2=(110000)_2,则一次选择 i=1,j=0 的操作会令 a_1:=(100110)_2,a_2:=(110001)_2,即交换了二进制最低位。

\hspace{15pt}求使得排列 a 变为升序排列(即对所有 1 \le i \lt 2^n 均有 a_i<a_{i+1})的最少操作次数。

输入描述:

\hspace{15pt}第一行输入一个整数 n \left(1\le n\le 20\right)
\hspace{15pt}第二行输入 2^n 个两两不同的整数 a_1,a_2,\dots,a_{2^n} \left(0 \leq a_i < 2^n\right)

输出描述:

\hspace{15pt}在一行上输出一个整数,表示所需的最少操作次数。
示例1

输入

复制
2
3 2 0 1

输出

复制
5

说明

\hspace{15pt}在这个样例中,刚开始 a_1=3=(11)_2,a_2=2=(10)_2,a_3=0=(00)_2,a_4=1=(01)_2。一种可能的所需次数最少的操作方法如下:
\hspace{23pt}\bullet\,选择 i=2,j=1,即交换 a_2a_3 的二进制从低到高第 2 位,序列变成 (11)_2,(00)_2,(10)_2,(01)_2
\hspace{23pt}\bullet\,选择 i=1,j=0,即交换 a_1a_2 的二进制从低到高第 1 位,序列变成 (10)_2,(01)_2,(10)_2,(01)_2
\hspace{23pt}\bullet\,选择 i=3,j=1,即交换 a_3a_4 的二进制从低到高第 2 位,序列变成 (10)_2,(01)_2,(00)_2,(11)_2
\hspace{23pt}\bullet\,选择 i=1,j=1,即交换 a_1a_2 的二进制从低到高第 2 位,序列变成 (00)_2,(11)_2,(00)_2,(11)_2
\hspace{23pt}\bullet\,选择 i=2,j=1,即交换 a_2a_3 的二进制从低到高第 2 位,序列变成 (00)_2,(01)_2,(10)_2,(11)_2
\hspace{15pt}此时序列为 a_1=(00)_2=0,a_2=(01)_2=1,a_3=(10)_2=2,a_4=(11)_2=3,满足条件。
示例2

输入

复制
3
7 5 3 4 0 2 1 6

输出

复制
22

说明