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

#include <algorithm>
#include <bitset>
#include <cassert>
#include <chrono>
#include <cmath>
#include <complex>
#include <fstream>
#include <functional>
#include <iomanip>
#include <iostream>
#include <limits>
#include <list>
#include <map>
#include <numeric>
#include <queue>
#include <random>
#include <set>
#include <stack>
#include <string>
#include <thread>
#include <unordered_map>
#include <utility>
#include <vector>
using namespace std;
typedef unsigned long long int ull;
typedef long long int ll;
typedef pair<ll, ll> pll;
typedef pair<int, int> pi;
typedef pair<double, double> pd;
typedef pair<double, ll> pdl;
#define F first
#define S second
const ll E = 1e18 + 7;
const ll MOD = 1000000007;

typedef complex<double> P;

double dif(P a, P b, P c) {
  a = b - a;
  c -= b;
  double ret = fabs(arg(c) - arg(a));
  if (ret >= asin(1) * 2) {
    ret = asin(1) * 4 - ret;
  }
  return ret;
}

double dist(P a, P b) { return abs(a - b); }

int main() {
  ll n;
  double r, s;
  cin >> n >> r >> s;
  s *= asin(1) / 90;
  ll mx = 10003;
  vector<vector<vector<double>>> dp(
      mx, vector<vector<double>>(n, vector<double>(n, E)));
  vector<P> a(n);
  for (auto &i : a) {
    double x, y;
    cin >> x >> y;
    i = {x, y};
  }
  ll ans = 0;
  vector<vector<vector<double>>> edge(
      n, vector<vector<double>>(n, vector<double>(n, E)));
  for (int i = 0; i < n; i++) {
    for (int t = 0; t < n; t++) {
      for (int h = 0; h < n; h++) {
        if (i == h || t == h || i == t || dif(a[i], a[t], a[h]) > s) {
          continue;
        }
        edge[i][t][h] = dist(a[t], a[i]);
      }
    }
  }
  for (int i = 1; i < n; i++) {
    dp[1][i][0] = dist(a[i], a[0]);
    if (dp[1][i][0] <= r) {
      ans = 1;
    }
  }
  for (int i = 1; ans == i; i++) {
    for (int t = 0; t < n; t++) {
      for (int h = 0; h < n; h++) {
        if (t == h || dp[i][t][h] > r) {
          continue;
        }
        // cout<<i<<" "<<t<<" "<<h<<" "<<dp[i][t][h]<<endl;
        for (int k = 0; k < n; k++) {
          // if(k==h || k==t || dif(a[k],a[t],a[h])>s){continue;}
          dp[i + 1][k][t] = min(dp[i + 1][k][t], dp[i][t][h] + edge[k][t][h]);
          if (dp[i + 1][k][t] <= r) {
            ans = i + 1;
          }
        }
      }
    }
  }
  cout << ans << endl;

  return 0;
}


Error: TLE

Fixed submission:

#include <algorithm>
#include <bitset>
#include <cassert>
#include <chrono>
#include <cmath>
#include <complex>
#include <fstream>
#include <functional>
#include <iomanip>
#include <iostream>
#include <limits>
#include <list>
#include <map>
#include <numeric>
#include <queue>
#include <random>
#include <set>
#include <stack>
#include <string>
#include <thread>
#include <unordered_map>
#include <utility>
#include <vector>
using namespace std;
typedef unsigned long long int ull;
typedef long long int ll;
typedef pair<ll, ll> pll;
typedef pair<int, int> pi;
typedef pair<double, double> pd;
typedef pair<double, ll> pdl;
#define F first
#define S second
const ll E = 1e18 + 7;
const ll MOD = 1000000007;

typedef complex<double> P;

double dif(P a, P b, P c) {
  a = b - a;
  c -= b;
  double ret = fabs(arg(c) - arg(a));
  if (ret >= asin(1) * 2) {
    ret = asin(1) * 4 - ret;
  }
  return ret;
}

double dist(P a, P b) { return abs(a - b); }

int main() {
  ll n;
  double r, s;
  cin >> n >> r >> s;
  s *= asin(1) / 90;
  ll mx = 10003;
  vector<vector<vector<double>>> dp(
      mx, vector<vector<double>>(n, vector<double>(n, E)));
  vector<P> a(n);
  for (auto &i : a) {
    double x, y;
    cin >> x >> y;
    i = {x, y};
  }
  ll ans = 0;
  for (int i = 1; i < n; i++) {
    dp[1][i][0] = dist(a[i], a[0]);
    if (dp[1][i][0] <= r) {
      ans = 1;
    }
  }
  for (int i = 1; ans == i; i++) {
    for (int t = 0; t < n; t++) {
      for (int h = 0; h < n; h++) {
        if (t == h || dp[i][t][h] > r) {
          continue;
        }
        // cout<<i<<" "<<t<<" "<<h<<" "<<dp[i][t][h]<<endl;
        for (int k = 0; k < n; k++) {
          if (k == h || k == t || dif(a[k], a[t], a[h]) > s) {
            continue;
          }
          dp[i + 1][k][t] =
              min(dp[i + 1][k][t], dp[i][t][h] + dist(a[t], a[k]));
          if (dp[i + 1][k][t] <= r) {
            ans = i + 1;
          }
        }
      }
    }
  }
  cout << ans << endl;

  return 0;
}