import java.util.*;
public class Main {
// -----------------------------------------
// 1. 使用归并排序统计逆序数 (最少相邻交换次数)
// -----------------------------------------
static long mergeSortCount(int[] arr, int left, int right, int[] temp) {
if (left >= right) return 0;
int mid = (left + right) >>> 1;
long invCount = 0;
invCount += mergeSortCount(arr, left, mid, temp);
invCount += mergeSortCount(arr, mid + 1, right, temp);
invCount += merge(arr, left, mid, right, temp);
return invCount;
}
static long merge(int[] arr, int left, int mid, int right, int[] temp) {
int i = left, j = mid + 1, k = 0;
long invCount = 0;
while (i <= mid && j <= right) {
if (arr[i] <= arr[j]) {
temp[k++] = arr[i++];
} else {
// arr[i] > arr[j] 表示产生了 (mid - i + 1) 个逆序
// 因为左段从 i 开始到 mid 都比 arr[j] 大
temp[k++] = arr[j++];
invCount += (mid - i + 1);
}
}
while (i <= mid) {
temp[k++] = arr[i++];
}
while (j <= right) {
temp[k++] = arr[j++];
}
for (int p = 0; p < k; p++) {
arr[left + p] = temp[p];
}
return invCount;
}
// -----------------------------------------
// 2. 获取 N×N 矩阵的顺时针螺旋遍历下标列表
// -----------------------------------------
static List<int[]> spiralOrderIndices(int N) {
List<int[]> order = new ArrayList<>();
int top = 0, bottom = N - 1;
int left = 0, right = N - 1;
while (true) {
// 从左到右
for (int col = left; col <= right; col++) {
order.add(new int[]{top, col});
}
top++;
if (top > bottom) break;
// 从上到下
for (int row = top; row <= bottom; row++) {
order.add(new int[]{row, right});
}
right--;
if (right < left) break;
// 从右到左
for (int col = right; col >= left; col--) {
order.add(new int[]{bottom, col});
}
bottom--;
if (bottom < top) break;
// 从下到上
for (int row = bottom; row >= top; row--) {
order.add(new int[]{row, left});
}
left++;
if (left > right) break;
}
return order;
}
public static void main
(String[] args
) { Scanner sc
= new Scanner
(System.
in); // 读取 N
int N = sc.nextInt();
// 读取矩阵
int[][] matrix = new int[N][N];
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
matrix[i][j] = sc.nextInt();
}
}
// 生成螺旋顺序下标列表
List<int[]> spiralPos = spiralOrderIndices(N);
// 依螺旋顺序将矩阵展成一维数组 arr
// arr 的期望排序结果应为 [1, 2, 3, ..., N^2]
int[] arr = new int[N * N];
for (int i = 0; i < spiralPos.size(); i++) {
int r = spiralPos.get(i)[0];
int c = spiralPos.get(i)[1];
arr[i] = matrix[r][c];
}
// 利用 归并排序 统计逆序数(即最少相邻交换次数)
int[] temp = new int[arr.length];
long inversions = mergeSortCount(arr, 0, arr.length - 1, temp);
// 输出结果
System.
out.
println(inversions
); }
}
aW1wb3J0IGphdmEudXRpbC4qOwoKcHVibGljIGNsYXNzIE1haW4gewogICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8vIDEuIOS9v+eUqOW9kuW5tuaOkuW6j+e7n+iuoemAhuW6j+aVsCAo5pyA5bCR55u46YK75Lqk5o2i5qyh5pWwKQogICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIHN0YXRpYyBsb25nIG1lcmdlU29ydENvdW50KGludFtdIGFyciwgaW50IGxlZnQsIGludCByaWdodCwgaW50W10gdGVtcCkgewogICAgICAgIGlmIChsZWZ0ID49IHJpZ2h0KSByZXR1cm4gMDsKICAgICAgICBpbnQgbWlkID0gKGxlZnQgKyByaWdodCkgPj4+IDE7CiAgICAgICAgbG9uZyBpbnZDb3VudCA9IDA7CiAgICAgICAgaW52Q291bnQgKz0gbWVyZ2VTb3J0Q291bnQoYXJyLCBsZWZ0LCBtaWQsIHRlbXApOwogICAgICAgIGludkNvdW50ICs9IG1lcmdlU29ydENvdW50KGFyciwgbWlkICsgMSwgcmlnaHQsIHRlbXApOwogICAgICAgIGludkNvdW50ICs9IG1lcmdlKGFyciwgbGVmdCwgbWlkLCByaWdodCwgdGVtcCk7CiAgICAgICAgcmV0dXJuIGludkNvdW50OwogICAgfQoKICAgIHN0YXRpYyBsb25nIG1lcmdlKGludFtdIGFyciwgaW50IGxlZnQsIGludCBtaWQsIGludCByaWdodCwgaW50W10gdGVtcCkgewogICAgICAgIGludCBpID0gbGVmdCwgaiA9IG1pZCArIDEsIGsgPSAwOwogICAgICAgIGxvbmcgaW52Q291bnQgPSAwOwogICAgICAgIHdoaWxlIChpIDw9IG1pZCAmJiBqIDw9IHJpZ2h0KSB7CiAgICAgICAgICAgIGlmIChhcnJbaV0gPD0gYXJyW2pdKSB7CiAgICAgICAgICAgICAgICB0ZW1wW2srK10gPSBhcnJbaSsrXTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIGFycltpXSA+IGFycltqXSDooajnpLrkuqfnlJ/kuoYgKG1pZCAtIGkgKyAxKSDkuKrpgIbluo8KICAgICAgICAgICAgICAgIC8vIOWboOS4uuW3puauteS7jiBpIOW8gOWni+WIsCBtaWQg6YO95q+UIGFycltqXSDlpKcKICAgICAgICAgICAgICAgIHRlbXBbaysrXSA9IGFycltqKytdOwogICAgICAgICAgICAgICAgaW52Q291bnQgKz0gKG1pZCAtIGkgKyAxKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB3aGlsZSAoaSA8PSBtaWQpIHsKICAgICAgICAgICAgdGVtcFtrKytdID0gYXJyW2krK107CiAgICAgICAgfQogICAgICAgIHdoaWxlIChqIDw9IHJpZ2h0KSB7CiAgICAgICAgICAgIHRlbXBbaysrXSA9IGFycltqKytdOwogICAgICAgIH0KICAgICAgICBmb3IgKGludCBwID0gMDsgcCA8IGs7IHArKykgewogICAgICAgICAgICBhcnJbbGVmdCArIHBdID0gdGVtcFtwXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGludkNvdW50OwogICAgfQoKICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvLyAyLiDojrflj5YgTsOXTiDnn6npmLXnmoTpobrml7bpkojonrrml4vpgY3ljobkuIvmoIfliJfooagKICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBzdGF0aWMgTGlzdDxpbnRbXT4gc3BpcmFsT3JkZXJJbmRpY2VzKGludCBOKSB7CiAgICAgICAgTGlzdDxpbnRbXT4gb3JkZXIgPSBuZXcgQXJyYXlMaXN0PD4oKTsKICAgICAgICBpbnQgdG9wID0gMCwgYm90dG9tID0gTiAtIDE7CiAgICAgICAgaW50IGxlZnQgPSAwLCByaWdodCA9IE4gLSAxOwogICAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgICAgIC8vIOS7juW3puWIsOWPswogICAgICAgICAgICBmb3IgKGludCBjb2wgPSBsZWZ0OyBjb2wgPD0gcmlnaHQ7IGNvbCsrKSB7CiAgICAgICAgICAgICAgICBvcmRlci5hZGQobmV3IGludFtde3RvcCwgY29sfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdG9wKys7CiAgICAgICAgICAgIGlmICh0b3AgPiBib3R0b20pIGJyZWFrOwoKICAgICAgICAgICAgLy8g5LuO5LiK5Yiw5LiLCiAgICAgICAgICAgIGZvciAoaW50IHJvdyA9IHRvcDsgcm93IDw9IGJvdHRvbTsgcm93KyspIHsKICAgICAgICAgICAgICAgIG9yZGVyLmFkZChuZXcgaW50W117cm93LCByaWdodH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJpZ2h0LS07CiAgICAgICAgICAgIGlmIChyaWdodCA8IGxlZnQpIGJyZWFrOwoKICAgICAgICAgICAgLy8g5LuO5Y+z5Yiw5bemCiAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IHJpZ2h0OyBjb2wgPj0gbGVmdDsgY29sLS0pIHsKICAgICAgICAgICAgICAgIG9yZGVyLmFkZChuZXcgaW50W117Ym90dG9tLCBjb2x9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBib3R0b20tLTsKICAgICAgICAgICAgaWYgKGJvdHRvbSA8IHRvcCkgYnJlYWs7CgogICAgICAgICAgICAvLyDku47kuIvliLDkuIoKICAgICAgICAgICAgZm9yIChpbnQgcm93ID0gYm90dG9tOyByb3cgPj0gdG9wOyByb3ctLSkgewogICAgICAgICAgICAgICAgb3JkZXIuYWRkKG5ldyBpbnRbXXtyb3csIGxlZnR9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBsZWZ0Kys7CiAgICAgICAgICAgIGlmIChsZWZ0ID4gcmlnaHQpIGJyZWFrOwogICAgICAgIH0KICAgICAgICByZXR1cm4gb3JkZXI7CiAgICB9CgogICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewogICAgICAgIFNjYW5uZXIgc2MgPSBuZXcgU2Nhbm5lcihTeXN0ZW0uaW4pOwogICAgICAgIC8vIOivu+WPliBOCiAgICAgICAgaW50IE4gPSBzYy5uZXh0SW50KCk7CiAgICAgICAgLy8g6K+75Y+W55+p6Zi1CiAgICAgICAgaW50W11bXSBtYXRyaXggPSBuZXcgaW50W05dW05dOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSB7CiAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgTjsgaisrKSB7CiAgICAgICAgICAgICAgICBtYXRyaXhbaV1bal0gPSBzYy5uZXh0SW50KCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIOeUn+aIkOieuuaXi+mhuuW6j+S4i+agh+WIl+ihqAogICAgICAgIExpc3Q8aW50W10+IHNwaXJhbFBvcyA9IHNwaXJhbE9yZGVySW5kaWNlcyhOKTsKCiAgICAgICAgLy8g5L6d6J665peL6aG65bqP5bCG55+p6Zi15bGV5oiQ5LiA57u05pWw57uEIGFycgogICAgICAgIC8vIGFyciDnmoTmnJ/mnJvmjpLluo/nu5PmnpzlupTkuLogWzEsIDIsIDMsIC4uLiwgTl4yXQogICAgICAgIGludFtdIGFyciA9IG5ldyBpbnRbTiAqIE5dOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3BpcmFsUG9zLnNpemUoKTsgaSsrKSB7CiAgICAgICAgICAgIGludCByID0gc3BpcmFsUG9zLmdldChpKVswXTsKICAgICAgICAgICAgaW50IGMgPSBzcGlyYWxQb3MuZ2V0KGkpWzFdOwogICAgICAgICAgICBhcnJbaV0gPSBtYXRyaXhbcl1bY107CiAgICAgICAgfQoKICAgICAgICAvLyDliKnnlKgg5b2S5bm25o6S5bqPIOe7n+iuoemAhuW6j+aVsCjljbPmnIDlsJHnm7jpgrvkuqTmjaLmrKHmlbApCiAgICAgICAgaW50W10gdGVtcCA9IG5ldyBpbnRbYXJyLmxlbmd0aF07CiAgICAgICAgbG9uZyBpbnZlcnNpb25zID0gbWVyZ2VTb3J0Q291bnQoYXJyLCAwLCBhcnIubGVuZ3RoIC0gMSwgdGVtcCk7CgogICAgICAgIC8vIOi+k+WHuue7k+aenAogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihpbnZlcnNpb25zKTsKICAgIH0KfQo=