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

#include <bits/stdc++.h>
using namespace std;

#define fi first
#define se second
#define repl(i, a, b) for (int i = (int)(a); i < (int)(b); i++)
#define repr(i, n) for (int i = (int)(n - 1); i >= 0; i--)
#define rep(i, n) repl(i, 0, n)
#define each(itr, v) for (auto itr : v)
#define pb(s) push_back(s)
#define all(x) (x).begin(), (x).end()
#define dbg(x) cout << #x " = " << x << endl
#define print(x) cout << x << endl
#define maxch(x, y) x = max(x, y)
#define minch(x, y) x = min(x, y)
#define uni(x) x.erase(unique(all(x)), x.end())
#define exist(x, y) (find(all(x), y) != x.end())
#define bcnt(x) bitset<32>(x).count()

typedef long long ll;
typedef unsigned long long ull;
typedef complex<double> P;
typedef set<int> S;

#define INF INT_MAX / 3
#define MAX_N 1000000001
#define pi acos(-1)

double dp[20][20][10001];
vector<int> to[20][20];

int main() {
  cin.sync_with_stdio(false);
  int n;
  double r, theta;
  cin >> n >> r >> theta;
  theta = (theta + 1e-3) * pi / 180.0;
  vector<P> v;
  rep(i, n) {
    double x, y;
    cin >> x >> y;
    v.pb(P(x, y));
  }

  rep(i, n) rep(j, n) rep(l, n) {
    if (j == l || i == l)
      continue;
    double alpha = abs(arg(v[l] - v[j]) - arg(v[j] - v[i]));
    if (alpha > pi)
      alpha = 2 * pi - alpha;
    if (alpha <= theta)
      to[i][j].pb(l);
  }

  rep(i, n) rep(j, n) rep(k, 10001) dp[i][j][k] = INF + 1;
  int ans = 0;
  repl(i, 1, n) {
    if (abs(v[i] - v[0]) <= r + 1e-3) {
      dp[0][i][1] = abs(v[i] - v[0]);
      ans = 1;
    }
  }
  repl(k, 1, 10000) {
    if (ans != k)
      break;
    rep(i, n) rep(j, n) {
      if (i == j)
        continue;
      if (dp[i][j][k] < INF) {
        rep(l, to[i][j].size()) {
          int next = to[i][j][l];
          if (dp[i][j][k] + abs(v[next] - v[j]) <= r + 1e-3) {
            minch(dp[j][next][k + 1], dp[i][j][k] + abs(v[next] - v[j]));
            ans = k + 1;
          }
        }
      }
    }
  }

  cout << ans << endl;

  return 0;
}

Error: TLE

Fixed submission:

#include <bits/stdc++.h>
using namespace std;

#define fi first
#define se second
#define repl(i, a, b) for (int i = (int)(a); i < (int)(b); i++)
#define repr(i, n) for (int i = (int)(n - 1); i >= 0; i--)
#define rep(i, n) repl(i, 0, n)
#define each(itr, v) for (auto itr : v)
#define pb(s) push_back(s)
#define all(x) (x).begin(), (x).end()
#define dbg(x) cout << #x " = " << x << endl
#define print(x) cout << x << endl
#define maxch(x, y) x = max(x, y)
#define minch(x, y) x = min(x, y)
#define uni(x) x.erase(unique(all(x)), x.end())
#define exist(x, y) (find(all(x), y) != x.end())
#define bcnt(x) bitset<32>(x).count()

typedef long long ll;
typedef unsigned long long ull;
typedef complex<double> P;
typedef set<int> S;

#define INF INT_MAX / 3
#define MAX_N 1000000001
#define pi acos(-1)

double dp[20][20][10001];

int main() {
  cin.sync_with_stdio(false);
  int n;
  double r, theta;
  cin >> n >> r >> theta;
  theta = (theta + 1e-3) * pi / 180.0;
  vector<P> v;
  rep(i, n) {
    double x, y;
    cin >> x >> y;
    v.pb(P(x, y));
  }

  rep(i, n) rep(j, n) rep(k, 10001) dp[i][j][k] = INF + 1;
  int ans = 0;
  repl(i, 1, n) {
    if (abs(v[i] - v[0]) <= r + 1e-3) {
      dp[0][i][1] = abs(v[i] - v[0]);
      ans = 1;
    }
  }
  repl(k, 1, 10000) {
    if (ans != k)
      break;
    rep(i, n) rep(j, n) {
      if (dp[i][j][k] < INF) {
        rep(l, n) {
          if (j == l || i == l)
            continue;
          double alpha = abs(arg(v[l] - v[j]) - arg(v[j] - v[i]));
          if (alpha > pi)
            alpha = 2 * pi - alpha;
          if (alpha <= theta && dp[i][j][k] + abs(v[l] - v[j]) <= r + 1e-3) {
            minch(dp[j][l][k + 1], dp[i][j][k] + abs(v[l] - v[j]));
            ans = k + 1;
          }
        }
      }
    }
  }

  cout << ans << endl;

  return 0;
}