Problem p02670 (C++) — buggy submission, verdict: Time Limit Exceeded

#include <algorithm>
#include <chrono>
#include <cmath>
#include <cstring>
#include <functional>
#include <iostream>
#include <limits.h>
#include <list>
#include <map>
#include <queue>
#include <set>
#include <sstream>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <utility>
#include <vector>

using namespace std;
typedef long long lint;
typedef vector<int> vi;
typedef pair<int, int> pii;

typedef vector<lint> vl;
typedef pair<lint, lint> pll;

const int di[4] = {-1, 0, 1, 0};
const int dj[4] = {0, -1, 0, 1};

int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(NULL);
  cout.tie(NULL);

  int n;
  cin >> n;
  vi p(n * n);
  for (int &i : p)
    cin >> i;

  vector<vi> _mp(n, vi(n));

  for (int i = 0; i < n * n; ++i) {
    int c = p[i] - 1;
    _mp[c / n][c % n] = i;
  }
  const vector<vi> mp = _mp;

  vector<vi> ans(n, vi(n, INT_MAX));

  //    deque<pii> bfs;

  for (int i = 0; i <= n - 1; i++) {
    for (int j = 0; j <= n - 1; j++) {
      int a = min(i, j);
      int na = min(n - 1 - i, n - 1 - j);
      ans[i][j] = min(a, na) + 1;
    }
  }
  int res = 0;
  //    vector<vi> dirs({{0,1}, {0,-1}, {-1,0}, {1,0}});

  vector<pii> bfs;
  for (int i = 0; i < n * n; ++i) {
    int c = p[i] - 1;
    res += ans[c / n][c % n] - 1;
    ans[c / n][c % n]--;

    bfs.clear();
    bfs.push_back({c / n, c % n});

    int cur = mp[c / n][c % n];

    for (int i = 0; i < bfs.size(); ++i) {
      pii pos = bfs[i];
      int len = ans[pos.first][pos.second];

      for (int did = 0; did < 4; ++did) {
        int nx = pos.first + di[did];
        int ny = pos.second + dj[did];
        if (nx >= 0 && nx < n && ny >= 0 && ny < n) {
          if (mp[nx][ny] < cur) {
            if (ans[nx][ny] > len) {
              ans[nx][ny] = len;
              bfs.emplace_back(nx, ny);
            }
          } else {
            if (ans[nx][ny] > len + 1) {
              ans[nx][ny] = len + 1;
              bfs.emplace_back(nx, ny);
            }
          }
        }
      }
    }
  }

  //    while(!bfs.empty()){
  //        pii pos = bfs.front(); bfs.pop_front();
  //        for (vi dir : dirs){
  //            int nx = pos.first + dir[0];
  //            int ny = pos.second + dir[1];
  //            int len = ans[pos.first][pos.second];
  //            if (nx >=0 && nx <n && ny>=0 && ny < n){
  //                if (mp[nx][ny] < mp[pos.first][pos.second]){
  //                    push({nx, ny}, len+1, 1);
  //                } else {
  //                    push({nx, ny}, len, 0);
  //                }
  //            }
  //        }
  //    }

  //    int res = 0;
  //    for (vi & va : ans){
  //        for (int i : va) res += i;
  //    }
  cout << res;
}


Error: TLE

Fixed submission:

#include <algorithm>
#include <chrono>
#include <cmath>
#include <cstring>
#include <functional>
#include <iostream>
#include <limits.h>
#include <list>
#include <map>
#include <queue>
#include <set>
#include <sstream>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <utility>
#include <vector>

using namespace std;
typedef long long lint;
typedef vector<int> vi;
typedef pair<int, int> pii;

typedef vector<lint> vl;
typedef pair<lint, lint> pll;

int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(NULL);
  cout.tie(NULL);

  int n;
  cin >> n;
  vi p(n * n);
  for (int &i : p)
    cin >> i;

  vector<vi> _mp(n, vi(n));

  for (int i = 0; i < n * n; ++i) {
    int c = p[i] - 1;
    _mp[c / n][c % n] = i;
  }
  const vector<vi> mp = _mp;

  vector<vi> ans(n, vi(n, INT_MAX));

  //    deque<pii> bfs;

  for (int i = 0; i <= n - 1; i++) {
    for (int j = 0; j <= n - 1; j++) {
      int a = min(i, j);
      int na = min(n - 1 - i, n - 1 - j);
      ans[i][j] = min(a, na) + 1;
    }
  }
  int res = 0;
  vector<vi> dirs({{0, 1}, {0, -1}, {-1, 0}, {1, 0}});

  vector<pii> bfs;
  for (int i = 0; i < n * n; ++i) {
    int c = p[i] - 1;
    res += ans[c / n][c % n] - 1;
    ans[c / n][c % n]--;

    bfs.clear();
    bfs.push_back({c / n, c % n});

    int cur = mp[c / n][c % n];

    for (int i = 0; i < bfs.size(); ++i) {
      pii pos = bfs[i];
      for (vi dir : dirs) {
        int nx = pos.first + dir[0];
        int ny = pos.second + dir[1];
        int len = ans[pos.first][pos.second];
        if (nx >= 0 && nx < n && ny >= 0 && ny < n) {
          if (mp[nx][ny] < cur) {
            if (ans[nx][ny] > len) {
              ans[nx][ny] = len;
              bfs.emplace_back(nx, ny);
            }
          } else {
            if (ans[nx][ny] > len + 1) {
              ans[nx][ny] = len + 1;
              bfs.emplace_back(nx, ny);
            }
          }
        }
      }
    }
  }

  //    while(!bfs.empty()){
  //        pii pos = bfs.front(); bfs.pop_front();
  //        for (vi dir : dirs){
  //            int nx = pos.first + dir[0];
  //            int ny = pos.second + dir[1];
  //            int len = ans[pos.first][pos.second];
  //            if (nx >=0 && nx <n && ny>=0 && ny < n){
  //                if (mp[nx][ny] < mp[pos.first][pos.second]){
  //                    push({nx, ny}, len+1, 1);
  //                } else {
  //                    push({nx, ny}, len, 0);
  //                }
  //            }
  //        }
  //    }

  //    int res = 0;
  //    for (vi & va : ans){
  //        for (int i : va) res += i;
  //    }
  cout << res;
}