// 演算法 / Algorithm: 同 C 版——以差分陣列在 O(n + limit) 內聚合每個配對的成本曲線，
// 再用前綴和找出讓總修改數最小的目標和 x。
// Same as C: aggregate per-pair cost curves into a diff array, prefix-sum, take the min.

#include <vector>      // STL 動態陣列 vector / dynamic array
#include <algorithm>   // 提供 std::min / for std::min
using namespace std;   // 省略 std:: 前綴 (僅在競賽/教學中使用) / drop the std:: prefix

class Solution {
public:
    int minMoves(vector<int>& nums, int limit) {
        int n = static_cast<int>(nums.size());     // 取得陣列長度 / get array length
        vector<int> d(2 * limit + 2, 0);            // 差分陣列；vector 預設用 0 初始化 / diff array, zero-initialised

        for (int i = 0; i < n / 2; ++i) {           // 走訪每組對稱配對 / loop over symmetric pairs
            int a = nums[i];                        // 左側元素 / left element
            int b = nums[n - 1 - i];                // 右側鏡像元素 / mirror element
            auto [lo, hi] = minmax(a, b);           // 結構化綁定 + minmax 一次取得小/大 / structured binding gets (min, max) at once

            d[lo + 1]         -= 1;                 // 進入 "只改一個" 區段，成本 2 → 1 / entering 1-move zone
            d[hi + limit + 1] += 1;                 // 離開 1-move 區段，成本 1 → 2 / leaving 1-move zone
            d[lo + hi]        -= 1;                 // 抵達 "剛好相加" 點，成本 1 → 0 / hitting 0-move point
            d[lo + hi + 1]    += 1;                 // 離開 0-move 點，成本 0 → 1 / leaving 0-move point
        }

        int ans = n;                                // 最壞情況上界 / upper bound: 2 moves per pair
        int cur = n;                                // f(x) 的累加器，基線為 n / running cost, baseline = n
        for (int x = 2; x <= 2 * limit; ++x) {      // 範圍式 for 也可以；這裡用索引較直觀 / index loop is clearer here
            cur += d[x];                            // 累加差分 = 前綴和 / prefix sum
            ans = min(ans, cur);                    // 取最小 / take minimum
        }
        return ans;                                 // 結束時 vector 會自動釋放 / vector cleans itself up
    }
};
