// competitive-verifier: PROBLEM https://yukicoder.me/problems/no/1028 #include #include #include #include #include #include /// @brief slope trick template struct slope_trick { slope_trick() = default; [[nodiscard]] T min_x() const { return l.top(); } [[nodiscard]] T min_value() const { return min_f; } /// @brief Add f(x) = a void add_const(T a) { min_f += a; } /// @brief Add f(x) = max(0, x - a) void add_x_minus_a(T a) { if (!l.empty() && l.top() > a) { min_f += l.top() - a; } l.push(a); r.push(l.top()); l.pop(); } /// @brief Add f(x) = max(0, a - x) void add_a_minus_x(T a) { if (!r.empty() && a > r.top()) { min_f += a - r.top(); } r.push(a); l.push(r.top()); r.pop(); } /// @brief Add f(x) = abs(x - a) = max(0, x - a) + max(0, a - x) void add_abs(T a) { add_x_minus_a(a); add_a_minus_x(a); } /// @brief f(x) <- min_{y <= x} f(y) void clear_right() { r = decltype(r)(); } /// @brief f(x) <- min_{y >= x} f(y) void clear_left() { l = decltype(l)(); } private: T min_f{}; std::priority_queue l; std::priority_queue, std::greater> r; }; int main(void) { int n; std::cin >> n; std::vector a(n, std::vector(n, 0)); for (auto& v : a) { for (auto& e : v) std::cin >> e; } std::vector> v(n); for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { v[a[i][j] - 1].add_const(j); v[a[i][j] - 1].add_x_minus_a(i + j); v[a[i][j] - 1].add_a_minus_x(i - j); } } int ans = 0; for (int i = 0; i < n; ++i) ans += v[i].min_value(); std::cout << ans << '\n'; return 0; }