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

#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < (n); ++i)
#define sz(x) int(x.size())
#define ALL(c) (c).begin(), (c).end()
#define SUM(x) std::accumulate(ALL(x), 0LL)
#define MIN(v) *std::min_element(v.begin(), v.end())
#define MAX(v) *std::max_element(v.begin(), v.end())
#define EXIST(v, x) (std::find(v.begin(), v.end(), x) != v.end())

using namespace std;
typedef long long ll;

template <class T> inline bool chmax(T &a, T b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
template <class T> inline bool chmin(T &a, T b) {
  if (a > b) {
    a = b;
    return true;
  }
  return false;
}
const int INF = 1001001001;
const long long INFL = (1LL << 60);
const double eps = (1e-9);

typedef pair<int, int> P; // 最短距離と頂点番号

// 隣接表現の圧縮版
// @param [in] n: ノード数
// @param [in] cost: 重みの隣接表現
// @param [in] s: スタートするノード
// @param [out] d: s からの距離
void dijkstra(const int &n, const vector<vector<pair<int, int>>> &cost,
              const int &s, vector<int> &d) {
  priority_queue<P, vector<P>, greater<P>>
      que; // P#first が小さい順に取り出せる
  d[s] = 0;
  que.push(P(0, s));

  while (!que.empty()) {
    P p = que.top();
    que.pop();
    int v = p.second;
    if (d[v] < p.first)
      continue;
    for (int j = 0; j < cost[v].size();
         j++) { // v から移動できる全ての node について
      int t = cost[v][j].first;
      int c = cost[v][j].second;
      if (d[t] > d[v] + c) {
        d[t] = d[v] + c;
        que.push(P(d[t], t));
      }
    }
  }
}

int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);

  int n, x, y;
  cin >> n >> x >> y;
  x--;
  y--;

  vector<vector<pair<int, int>>> cost(n, vector<pair<int, int>>());
  for (int i = 1; i < n; i++) {
    cost[i - 1].emplace_back(i, 1);
    cost[i].emplace_back(i - 1, 1);
  }
  cost[x].emplace_back(y, 1);
  cost[y].emplace_back(x, 1);

  vector<ll> ans(n, 0);

  for (int i = 0; i < n; i++) {
    vector<int> d(n, INF);
    dijkstra(n, cost, i, d);
    for (int j = i + 1; j < n; j++) {
      ans[d[j]]++;
    }
  }

  for (int i = 1; i < n; i++) {
    cout << ans[i] << endl;
  }

  return 0;
}


Error: TLE

Fixed submission:

#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < (n); ++i)
#define sz(x) int(x.size())
#define ALL(c) (c).begin(), (c).end()
#define SUM(x) std::accumulate(ALL(x), 0LL)
#define MIN(v) *std::min_element(v.begin(), v.end())
#define MAX(v) *std::max_element(v.begin(), v.end())
#define EXIST(v, x) (std::find(v.begin(), v.end(), x) != v.end())

using namespace std;
typedef long long ll;

template <class T> inline bool chmax(T &a, T b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
template <class T> inline bool chmin(T &a, T b) {
  if (a > b) {
    a = b;
    return true;
  }
  return false;
}
const int INF = 1001001001;
const long long INFL = (1LL << 60);
const double eps = (1e-9);

typedef pair<int, int> P; // 最短距離と頂点番号

// @param [in] n: ノード数
// @param [in] cost: 重みの隣接表現
// @param [in] s: スタートするノード
// @param [out] d: s からの距離
void dijkstra(const int &n, const vector<vector<int>> &cost, const int &s,
              vector<int> &d) {
  priority_queue<P, vector<P>, greater<P>>
      que; // P#first が小さい順に取り出せる
  d[s] = 0;
  que.push(P(0, s)); // 始めにスタートするノードを pque に登録

  while (!que.empty()) {
    P p = que.top();
    que.pop(); // que に入っているノードの内，最もスタート地点に近いもの
    int v = p.second;
    if (d[v] < p.first)
      continue; // 別のルート経由で既により短いルートが決まっていた場合
    for (int j = 0; j < n; j++) {
      if (d[j] > d[v] + cost[v][j]) { // j に対して v から移動した方が近い場合は
        d[j] = d[v] + cost[v][j]; // v からのコストを最短距離として登録する
        que.push(P(d[j], j)); // j の値が更新されたので que に登録する
      }
    }
  }
}

int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);

  int n, x, y;
  cin >> n >> x >> y;
  x--;
  y--;

  vector<vector<int>> cost(n, vector<int>(n, INF));
  for (int i = 1; i < n; i++) {
    cost[i][i] = 0;
    cost[i - 1][i] = 1;
    cost[i][i - 1] = 1;
  }
  cost[x][y] = 1;
  cost[y][x] = 1;

  vector<ll> ans(n, 0);

  for (int i = 0; i < n; i++) {
    vector<int> d(n, INF);
    dijkstra(n, cost, i, d);
    for (int j = i + 1; j < n; j++) {
      ans[d[j]]++;
    }
  }

  for (int i = 1; i < n; i++) {
    cout << ans[i] << endl;
  }

  return 0;
}