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

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

#define rep(i, x, y) for (int i = (x); i < (y); ++i)
#define debug(x) #x << "=" << (x)

#ifdef DEBUG
#define _GLIBCXX_DEBUG
#define dump(x) std::cerr << debug(x) << " (L:" << __LINE__ << ")" << std::endl
#else
#define dump(x)
#endif

typedef long long int ll;
typedef pair<int, int> pii;
// template<typename T> using vec=std::vector<T>;

const int inf = 1 << 30;
const long long int infll = 1LL << 58;
const double eps = 1e-8;
const int dx[] = {1, 0, -1, 0}, dy[] = {0, 1, 0, -1};

template <typename T> ostream &operator<<(ostream &os, const vector<T> &vec) {
  os << "[";
  for (const auto &v : vec) {
    os << v << ",";
  }
  os << "]";
  return os;
}

void solve() {
  int n;
  long double r, theta;
  cin >> n >> r >> theta;
  theta = theta / 360 * 2 * 3.141592653589793;
  const double cos_theta = cosl(theta);
  vector<long double> x(n), y(n);
  rep(i, 0, n) cin >> x[i] >> y[i];

  int ans = 0;
  long double dp[20][20];
  fill_n((long double *)dp, 20 * 20, inf);
  rep(i, 1, n) dp[0][i] =
      sqrtl((x[i] - x[0]) * (x[i] - x[0]) + (y[i] - y[0]) * (y[i] - y[0]));
  while (true) {
    if ([&] {
          long double mini = inf;
          rep(i, 0, n) rep(j, 0, n) mini = min(mini, dp[i][j]);
          return mini;
        }() < r)
      ++ans;
    else
      break;

    long double prev[20][20];
    memcpy(prev, dp, sizeof(long double) * 20 * 20);
    fill_n((long double *)dp, 20 * 20, inf);
    rep(i, 0, n) rep(j, 0, n) rep(k, 0, n) {
      if (i == j or j == k)
        continue;
      const long double l1 =
          sqrtl((x[j] - x[i]) * (x[j] - x[i]) + (y[j] - y[i]) * (y[j] - y[i]));
      const long double l2 =
          sqrtl((x[k] - x[j]) * (x[k] - x[j]) + (y[k] - y[j]) * (y[k] - y[j]));
      if (((x[j] - x[i]) * (x[k] - x[j]) + (y[j] - y[i]) * (y[k] - y[j])) / l1 /
              l2 <
          cos_theta)
        continue;
      dp[j][k] = min(dp[j][k], prev[i][j] + l2);
    }
  }
  cout << ans << endl;
}

int main() {
  std::ios::sync_with_stdio(false);
  std::cin.tie(0);
  cout << fixed << setprecision(8);
  solve();
  return 0;
}

Error: TLE

Fixed submission:

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

#define rep(i, x, y) for (int i = (x); i < (y); ++i)
#define debug(x) #x << "=" << (x)

#ifdef DEBUG
#define _GLIBCXX_DEBUG
#define dump(x) std::cerr << debug(x) << " (L:" << __LINE__ << ")" << std::endl
#else
#define dump(x)
#endif

typedef long long int ll;
typedef pair<int, int> pii;
// template<typename T> using vec=std::vector<T>;

const int inf = 1 << 30;
const long long int infll = 1LL << 58;
const double eps = 1e-8;
const int dx[] = {1, 0, -1, 0}, dy[] = {0, 1, 0, -1};

template <typename T> ostream &operator<<(ostream &os, const vector<T> &vec) {
  os << "[";
  for (const auto &v : vec) {
    os << v << ",";
  }
  os << "]";
  return os;
}

void solve() {
  int n;
  long double r, theta;
  cin >> n >> r >> theta;
  theta = theta / 360 * 2 * 3.141592653589793;
  vector<long double> x(n), y(n);
  rep(i, 0, n) cin >> x[i] >> y[i];

  int ans = 0;
  long double dp[20][20];
  fill_n((long double *)dp, 20 * 20, inf);
  rep(i, 1, n) dp[0][i] =
      sqrtl((x[i] - x[0]) * (x[i] - x[0]) + (y[i] - y[0]) * (y[i] - y[0]));
  while (true) {
    if ([&] {
          long double mini = inf;
          rep(i, 0, n) rep(j, 0, n) mini = min(mini, dp[i][j]);
          return mini;
        }() < r)
      ++ans;
    else
      break;

    long double prev[20][20];
    memcpy(prev, dp, sizeof(long double) * 20 * 20);
    fill_n((long double *)dp, 20 * 20, inf);
    rep(i, 0, n) rep(j, 0, n) rep(k, 0, n) {
      if (i == j or j == k)
        continue;
      const long double l1 =
          sqrtl((x[j] - x[i]) * (x[j] - x[i]) + (y[j] - y[i]) * (y[j] - y[i]));
      const long double l2 =
          sqrtl((x[k] - x[j]) * (x[k] - x[j]) + (y[k] - y[j]) * (y[k] - y[j]));
      if (((x[j] - x[i]) * (x[k] - x[j]) + (y[j] - y[i]) * (y[k] - y[j])) / l1 /
              l2 <
          cosl(theta))
        continue;
      dp[j][k] = min(dp[j][k], prev[i][j] + l2);
    }
  }
  cout << ans << endl;
}

int main() {
  std::ios::sync_with_stdio(false);
  std::cin.tie(0);
  cout << fixed << setprecision(8);
  solve();
  return 0;
}