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

#include <bits/stdc++.h>

using namespace std;

#define REP1(i, n) for (int i = 1, i##_len = (n); i < i##_len; ++i)
#define REP(i, n) for (int i = 0, i##_len = (n); i < i##_len; ++i)
#define pow(x) x *x
#define ll long long
static const ll MAX = 1000000;
static const ll INFTY = 1e12;

struct edge {
  ll to, cost;
};

using Graph = vector<vector<int>>;
using _Graph = vector<vector<edge>>;

const int dx[4] = {1, 0, -1, 0};
const int dy[4] = {0, 1, 0, -1};

// 深さ優先探索
vector<bool> seen;
vector<int> colors;

int H, W, N;
int sx, sy, gx, gy;
vector<vector<char>> field;
vector<vector<int>> dist;
// vector<pair<int, int>> gx, gy;
deque<pair<int, int>> que;

typedef vector<vector<int>> Matrix;

const int INF = 100000000;

int main() {

  int N, X, Y;
  cin >> N >> X >> Y;
  Graph g(N);
  REP(i, N - 1) {
    g[i].push_back(i + 1);
    g[i + 1].push_back(i);
    // d[i][i+1] = 1;
    // d[i+1][i] = 1;
  }
  X--;
  Y--;
  g[X].push_back(Y);
  g[Y].push_back(X);
  // d[X][Y] = 1;
  // d[Y][X] = 1;

  vector<ll> ans(N);

  REP(i, N) {
    // BFS のためのデータ構造
    vector<int> dist(N, -1); // 全頂点を「未訪問」に初期化
    queue<int> que;

    // 初期条件 (頂点 0 を初期ノードとする)
    dist[i] = 0;
    que.push(i); // 0 を橙色頂点にする

    // BFS 開始 (キューが空になるまで探索を行う)
    while (!que.empty()) {
      int v = que.front(); // キューから先頭頂点を取り出す
      que.pop();

      // v から辿れる頂点をすべて調べる
      for (int nv : g[v]) {
        if (dist[nv] != -1)
          continue; // すでに発見済みの頂点は探索しない

        // 新たな白色頂点 nv について距離情報を更新してキューに追加する
        dist[nv] = dist[v] + 1;
        // cout << "AA" << endl;
        ans[dist[nv]]++;
        que.push(nv);
      }
    }
  }

  REP1(i, N) { cout << ans[i] / 2 << endl; }
}
/*
                   _ooOoo_
                  o8888888o
                  88" . "88
                  (| -_- |)
                  O\\  =  /O
               ____/`---'\\____
             .'  \\\\|     |//  `.
            /  \\\\|||  :  |||//  \\
           /  _||||| -:- |||||-  \\
           |   | \\\\\\  -  /// |   |
           | \\_|  ''\\---/''  |   |
           \\  .-\\__  `-`  ___/-. /
         ___`. .'  /--.--\\  `. . __
      ."" '<  `.___\\_<|>_/___.'  >'"".
     | | :  `- \\`.;`\\ _ /`;.`/ - ` : | |
     \\  \\ `-.   \\_ __\\ /__ _/   .-` /  /
======`-.____`-.___\\_____/___.-`____.-'======
                   `=---='
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
         pass System Test!
*/


Error: TLE

Fixed submission:

#include <bits/stdc++.h>

using namespace std;

#define REP1(i, n) for (int i = 1, i##_len = (n); i < i##_len; ++i)
#define REP(i, n) for (int i = 0, i##_len = (n); i < i##_len; ++i)
#define pow(x) x *x
#define ll long long
static const ll MAX = 1000000;
static const ll INFTY = 1e12;

struct edge {
  ll to, cost;
};

using Graph = vector<vector<int>>;
using _Graph = vector<vector<edge>>;

const int dx[4] = {1, 0, -1, 0};
const int dy[4] = {0, 1, 0, -1};

// 深さ優先探索
vector<bool> seen;
vector<int> colors;

int H, W, N;
int sx, sy, gx, gy;
vector<vector<char>> field;
vector<vector<int>> dist;
// vector<pair<int, int>> gx, gy;
deque<pair<int, int>> que;

typedef vector<vector<int>> Matrix;

const int INF = 100000000;
Matrix
    d; // グラフの距離を格納した2次元配列（隣接行列）
       // d[u][v]は辺e=(u,v)のコスト（辺が存在しない場合はINF、ただしd[i][i]=0）

void warshall_floyd(int n) {
  for (int k = 0; k < n; k++) {     // 経由する頂点
    for (int i = 0; i < n; i++) {   // 始点
      for (int j = 0; j < n; j++) { // 終点
        d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
      }
    }
  }
}

int main() {

  int N, X, Y;
  cin >> N >> X >> Y;
  d = Matrix(N, vector<int>(N, INF));
  Graph g(N);
  REP(i, N - 1) {
    // g[i].push_back(i+1);
    // g[i].push_back(i+1);
    d[i][i + 1] = 1;
    d[i + 1][i] = 1;
  }
  X--;
  Y--;
  // g[X].push_back(Y);
  // g[Y].push_back(X);
  d[X][Y] = 1;
  d[Y][X] = 1;

  // cout << N << endl;
  // for(int i = 2; i <= N-1; i++){
  //     ll ans = 0;
  //     if(i <= (Y-X)){
  //         ans = N - i;
  //         ll migi = X - 0;
  //         ll hidari = N - Y;
  //         ll yoyu = min(migi, hidari);
  //         cout << "you" << yoyu << endl;
  //         if(yoyu > (i-1)){
  //             ans += i;
  //         }else {
  //             ans += yoyu;
  //         }
  //     }else{

  //     }

  //     cout << ans << endl;
  // }
  warshall_floyd(N);
  vector<ll> ans(N, 0);
  REP(i, N) {
    for (int j = i + 1; j < N; j++) {
      if (d[i][j] < INF)
        ans[d[i][j]]++;

      // cout << d[i][j] <<" ";
    }
  }
  REP1(i, N) { cout << ans[i] << endl; }
}
/*
                   _ooOoo_
                  o8888888o
                  88" . "88
                  (| -_- |)
                  O\\  =  /O
               ____/`---'\\____
             .'  \\\\|     |//  `.
            /  \\\\|||  :  |||//  \\
           /  _||||| -:- |||||-  \\
           |   | \\\\\\  -  /// |   |
           | \\_|  ''\\---/''  |   |
           \\  .-\\__  `-`  ___/-. /
         ___`. .'  /--.--\\  `. . __
      ."" '<  `.___\\_<|>_/___.'  >'"".
     | | :  `- \\`.;`\\ _ /`;.`/ - ` : | |
     \\  \\ `-.   \\_ __\\ /__ _/   .-` /  /
======`-.____`-.___\\_____/___.-`____.-'======
                   `=---='
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
         pass System Test!
*/