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

#include <bits/stdc++.h>
using namespace std;
#define rep(i, n) for (int i = 0; i < (n); i++)
#define F first
#define S second
typedef double D;
typedef complex<D> P;
typedef pair<double, int> P1;
typedef pair<int, int> P2;
typedef pair<P1, P2> P3;
int n, ans;
P p[21];
D r, qu, dp[10001][21][21], t[21][21];
int main() {
  cin >> n >> r >> qu;
  rep(i, 10001) rep(j, 21) rep(k, 21) dp[i][j][k] = 1e15;
  rep(i, n) {
    D x, y;
    cin >> x >> y;
    p[i] = P(x, y);
  }
  priority_queue<P3, vector<P3>, greater<P3>> q;
  for (int i = 1; i < n; i++) {
    if (abs(p[0] - p[i]) > r)
      continue;
    dp[1][0][i] = abs(p[0] - p[i]);
    q.push(P3(P1(dp[1][0][i], 1), P2(0, i)));
  }
  rep(i, n) rep(j, n) t[i][j] = abs(p[i] - p[j]);
  while (!q.empty()) {
    P3 ppp = q.top();
    q.pop();
    int pre = ppp.S.F;
    int now = ppp.S.S;
    int num = ppp.F.S;
    double cost = ppp.F.F;
    if (dp[num][pre][now] < cost)
      continue;
    rep(i, n) if (now != i) {
      D a = t[pre][now];
      D b = t[now][i];
      D c = t[pre][i];
      D radi = acos((a * a + b * b - c * c) / (2 * a * b));
      radi = radi / M_PI * 180;
      if (180.0 - radi > qu)
        continue;
      if (cost + abs(p[now] - p[i]) > r)
        continue;
      if (dp[num + 1][now][i] <= cost + t[i][now])
        continue;
      dp[num + 1][now][i] = cost + t[i][now];
      q.push(P3(P1(dp[num + 1][now][i], num + 1), P2(now, i)));
    }
  }
  dp[0][0][0] = 1;
  for (int i = 10000; i >= 0; i--) {
    rep(j, 21) rep(k, 21) if (dp[i][j][k] != 1e15) {
      cout << i << endl;
      return 0;
    }
  }
}

Error: TLE

Fixed submission:

#include <bits/stdc++.h>
using namespace std;
#define rep(i, n) for (int i = 0; i < (n); i++)
#define F first
#define S second
typedef double D;
typedef complex<D> P;
typedef pair<double, int> P1;
typedef pair<int, int> P2;
typedef pair<P1, P2> P3;
int n, ans;
P p[21];
D r, qu, dp[10001][21][21];
int main() {
  cin >> n >> r >> qu;
  rep(i, 10001) rep(j, 21) rep(k, 21) dp[i][j][k] = 1e15;
  rep(i, n) {
    D x, y;
    cin >> x >> y;
    p[i] = P(x, y);
  }
  priority_queue<P3, vector<P3>, greater<P3>> q;
  for (int i = 1; i < n; i++) {
    if (abs(p[0] - p[i]) > r)
      continue;
    dp[1][0][i] = abs(p[0] - p[i]);
    q.push(P3(P1(dp[1][0][i], 1), P2(0, i)));
  }
  while (!q.empty()) {
    P3 ppp = q.top();
    q.pop();
    int pre = ppp.S.F;
    int now = ppp.S.S;
    int num = ppp.F.S;
    double cost = ppp.F.F;
    if (dp[num][pre][now] < cost)
      continue;
    rep(i, n) if (now != i) {
      D a = abs(p[pre] - p[now]);
      D b = abs(p[now] - p[i]);
      D c = abs(p[i] - p[pre]);
      D radi = acos((a * a + b * b - c * c) / (2 * a * b));
      radi = radi / M_PI * 180;
      if (180.0 - radi > qu)
        continue;
      if (cost + abs(p[now] - p[i]) > r)
        continue;
      if (dp[num + 1][now][i] <= cost + abs(p[now] - p[i]))
        continue;
      dp[num + 1][now][i] = cost + abs(p[now] - p[i]);
      q.push(P3(P1(dp[num + 1][now][i], num + 1), P2(now, i)));
    }
  }
  dp[0][0][0] = 1;
  for (int i = 10000; i >= 0; i--) {
    rep(j, 21) rep(k, 21) if (dp[i][j][k] != 1e15) {
      cout << i << endl;
      return 0;
    }
  }
}