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

/* include */
#include "bits/stdc++.h"
/* namespace */
using namespace std;
/* typedef */
/* long系 */
typedef long long ll;   // long long
typedef long double ld; // long double
/* vector系 */
typedef vector<int> vint;                  // intのvector
typedef vector<double> vdouble;            // doubleのvector
typedef vector<ll> vll;                    // llのvector
typedef vector<ld> vld;                    // ldのvector
typedef vector<pair<int, int>> vi_i;       // i_iのvector
typedef vector<pair<double, double>> vd_d; // d_dのvector
typedef vector<pair<ll, ll>> vl_l;         // l_lのvector
typedef vector<pair<ld, ld>> vld_ld;       // ld_ldのvector
typedef vector<string> vstring;            // stringのvector
/* pair系 */
typedef pair<int, int> i_i;       // int同士のpair
typedef pair<double, double> d_d; // double同士のpair
typedef pair<ll, ll> l_l;         // ll同士のpair
typedef pair<ld, ld> ld_ld;       // ld同士のpair
/* define */
#define pb push_back              // push_back
#define all(v) v.begin(), v.end() // コンテナ全体
#define PI (acos(-1))             // 円周率pi
/* 変数入出力 read, write */
template <typename T> // 1変数
void read(T &x) {
  cin >> x;
}
template <typename T, typename T0> // 2変数
void read(T &x, T0 &y) {
  cin >> x >> y;
}
template <typename T, typename T0, typename T1> // 3変数
void read(T &x, T0 &y, T1 &z) {
  cin >> x >> y >> z;
}
template <typename T, typename T0, typename T1, typename T2> // 4変数
void read(T &x, T0 &y, T1 &z, T2 &w) {
  cin >> x >> y >> z >> w;
}
template <typename T> // 1変数
void write(T &x) {
  cout << x << endl;
}
template <typename T, typename T0> // 2変数
void write(T &x, T0 &y) {
  cout << x << " " << y << endl;
}
template <typename T, typename T0, typename T1> // 3変数
void write(T &x, T0 &y, T1 &z) {
  cout << x << " " << y << " " << z << endl;
}
template <typename T, typename T0, typename T1, typename T2> // 4変数
void write(T &x, T0 &y, T1 &z, T2 &w) {
  cout << x << " " << y << " " << z << " " << w << endl;
}
// vectorの出力
template <typename T> void printvec(const vector<T> &data) {
  for (const auto elm : data) {
    cout << elm << " ";
  }
  cout << endl;
}

using Graph = vector<vector<int>>;

int main(void) {
  // 頂点数と辺数
  int n, x, y;
  read(n, x, y);
  x--;
  y--;

  // グラフ入力受取 (ここでは無向グラフを想定)
  Graph G(n);
  for (int i = 0; i < n - 1; ++i) {
    G[i].push_back(i + 1);
    G[i + 1].push_back(i);
  }
  G[x].pb(y);
  G[y].pb(x);

  vint lt;
  lt.resize(n);
  fill(all(lt), 0);
  for (int j = 0; j < n; j++) {
    // BFS のためのデータ構造
    vector<int> dist(n, -1); // 全頂点を「未訪問」に初期化
    queue<int> que;          // 訪問保留中の頂点集合

    // 初期条件 (頂点 0 を初期ノードとする)
    dist[j] = 0;
    que.push(j); // 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;
        que.push(nv);
      }
    }

    // 結果出力 (各頂点の頂点 0 からの距離を見る)
    for (int v = 0; v < n; ++v) {
      if (dist[v] == 0)
        continue;
      else
        lt[dist[v] - 1]++;
    }
  }
  for (int i = 0; i < n - 1; i++) {
    lt[i] /= 2;
    write(lt[i]);
  }

  return 0;
}


Error: TLE

Fixed submission:

/* include */
#include "bits/stdc++.h"
/* namespace */
using namespace std;
/* typedef */
/* long系 */
typedef long long ll;   // long long
typedef long double ld; // long double
/* vector系 */
typedef vector<int> vint;                  // intのvector
typedef vector<double> vdouble;            // doubleのvector
typedef vector<ll> vll;                    // llのvector
typedef vector<ld> vld;                    // ldのvector
typedef vector<pair<int, int>> vi_i;       // i_iのvector
typedef vector<pair<double, double>> vd_d; // d_dのvector
typedef vector<pair<ll, ll>> vl_l;         // l_lのvector
typedef vector<pair<ld, ld>> vld_ld;       // ld_ldのvector
typedef vector<string> vstring;            // stringのvector
/* pair系 */
typedef pair<int, int> i_i;       // int同士のpair
typedef pair<double, double> d_d; // double同士のpair
typedef pair<ll, ll> l_l;         // ll同士のpair
typedef pair<ld, ld> ld_ld;       // ld同士のpair
/* define */
#define pb push_back              // push_back
#define all(v) v.begin(), v.end() // コンテナ全体
#define PI (acos(-1))             // 円周率pi
/* 変数入出力 read, write */
template <typename T> // 1変数
void read(T &x) {
  cin >> x;
}
template <typename T, typename T0> // 2変数
void read(T &x, T0 &y) {
  cin >> x >> y;
}
template <typename T, typename T0, typename T1> // 3変数
void read(T &x, T0 &y, T1 &z) {
  cin >> x >> y >> z;
}
template <typename T, typename T0, typename T1, typename T2> // 4変数
void read(T &x, T0 &y, T1 &z, T2 &w) {
  cin >> x >> y >> z >> w;
}
template <typename T> // 1変数
void write(T &x) {
  cout << x << endl;
}
template <typename T, typename T0> // 2変数
void write(T &x, T0 &y) {
  cout << x << " " << y << endl;
}
template <typename T, typename T0, typename T1> // 3変数
void write(T &x, T0 &y, T1 &z) {
  cout << x << " " << y << " " << z << endl;
}
template <typename T, typename T0, typename T1, typename T2> // 4変数
void write(T &x, T0 &y, T1 &z, T2 &w) {
  cout << x << " " << y << " " << z << " " << w << endl;
}
// vectorの出力
template <typename T> void printvec(const vector<T> &data) {
  for (const auto elm : data) {
    cout << elm << " ";
  }
  cout << endl;
}

using Graph = vector<vector<int>>;

int main(void) {
  // 頂点数と辺数
  int n, x, y;
  read(n, x, y);
  x--;
  y--;

  // グラフ入力受取 (ここでは無向グラフを想定)
  Graph G(n);
  for (int i = 0; i < n - 1; ++i) {
    G[i].push_back(i + 1);
    G[i + 1].push_back(i);
  }
  G[x].pb(y);
  G[y].pb(x);

  vint lt;
  lt.resize(n);
  fill(all(lt), 0);
  for (int j = 0; j < n; j++) {
    // BFS のためのデータ構造
    vector<int> dist(n, -1); // 全頂点を「未訪問」に初期化
    queue<int> que;          // 訪問保留中の頂点集合

    // 初期条件 (頂点 0 を初期ノードとする)
    dist[j] = 0;
    que.push(j); // 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;
        que.push(nv);
      }
    }

    for (int i = 1; i <= n - 1; i++) {
      // 結果出力 (各頂点の頂点 0 からの距離を見る)
      for (int v = 0; v < n; ++v) {
        if (dist[v] == i)
          lt[i - 1]++;
      }
    }
  }
  for (int i = 0; i < n - 1; i++) {
    lt[i] /= 2;
    write(lt[i]);
  }

  return 0;
}