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

#include <algorithm>
#include <cctype>
#include <climits>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <fstream>
#include <functional>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <utility>
#include <vector>
using namespace std;
inline int toInt(string s) {
  int v;
  istringstream sin(s);
  sin >> v;
  return v;
}
template <class T> inline string toStr(T x) {
  ostringstream sout;
  sout << x;
  return sout.str();
}
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef vector<string> vs;
typedef pair<int, int> pii;
typedef long long ll;
#define ALL(a) (a).begin(), (a).end()
#define RALL(a) (a).rbegin(), (a).rend()
#define FOR(i, a, b) for (int i = (a); i <= (b); ++i)
#define REP(i, n) FOR(i, 0, (n)-1)
const double EPS = 1e-12;
const double PI = acos(-1.0);
const int INF = INT_MAX / 10;

double K, R, L, P, E, T;

struct state {
  int d, m;
  double r, l;
  state(int d, double r, double l, int m) : d(d), r(r), l(l), m(m){};
};

bool ok(double r, double l) {
  if (T - E <= r && l <= T + E) {
    return true;
  } else {
    return false;
  }
}

bool out(double r, double l) {
  if (l <= T - E || T + E <= r) {
    return true;
  } else {
    return false;
  }
}

bool ok2(double r, double l) {
  double H = (r + l) / 2;
  if (abs(T - H) < E) {
    return true;
  } else {
    return false;
  }
}

int main() {
  cin >> K >> R >> L >> P >> E >> T;

  stack<state> S;
  S.push(state(0, R, L, 0));
  double ans = 0;
  while (!S.empty()) {
    state st = S.top();
    S.pop();
    double H = (st.r + st.l) / 2;

    if (ok(st.r, st.l)) {
      double p = pow(1 - P, st.d - st.m) * pow(P, st.m);
      ans += p;
      continue;
    }

    if (out(st.r, st.l)) {
      continue;
    }

    if (st.d == K) {
      if (ok2(st.r, st.l)) {
        double p = pow(1 - P, st.d - st.m) * pow(P, st.m);
        ans += p;
        continue;
      }
      continue;
    }

    if (T <= H) {
      S.push(state(st.d + 1, st.r, H, st.m));
      S.push(state(st.d + 1, H, st.l, st.m + 1));
      continue;
    } else {
      S.push(state(st.d + 1, st.r, H, st.m + 1));
      S.push(state(st.d + 1, H, st.l, st.m));
      continue;
    }
  }

  printf("%.6f\\n", ans);
  return 0;
}

Error: TLE

Fixed submission:

#include <algorithm>
#include <cctype>
#include <climits>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <fstream>
#include <functional>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <utility>
#include <vector>
using namespace std;
inline int toInt(string s) {
  int v;
  istringstream sin(s);
  sin >> v;
  return v;
}
template <class T> inline string toStr(T x) {
  ostringstream sout;
  sout << x;
  return sout.str();
}
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef vector<string> vs;
typedef pair<int, int> pii;
typedef long long ll;
#define ALL(a) (a).begin(), (a).end()
#define RALL(a) (a).rbegin(), (a).rend()
#define FOR(i, a, b) for (int i = (a); i <= (b); ++i)
#define REP(i, n) FOR(i, 0, (n)-1)
const double EPS = 1e-12;
const double PI = acos(-1.0);
const int INF = INT_MAX / 10;

double K, R, L, P, E, T;

struct state {
  int d, m;
  double r, l;
  state(int d, double r, double l, int m) : d(d), r(r), l(l), m(m){};
};

bool ok(double r, double l) {
  if (T - E <= r && l <= T + E) {
    return true;
  } else {
    return false;
  }
}

bool out(double r, double l) {
  if (l <= T - E && T + E <= r) {
    return true;
  } else {
    return false;
  }
}

bool ok2(double r, double l) {
  double H = (r + l) / 2;
  if (abs(T - H) < E) {
    return true;
  } else {
    return false;
  }
}

int main() {
  cin >> K >> R >> L >> P >> E >> T;

  stack<state> S;
  S.push(state(0, R, L, 0));
  double ans = 0;
  while (!S.empty()) {
    state st = S.top();
    S.pop();
    double H = (st.r + st.l) / 2;

    if (ok(st.r, st.l)) {
      double p = pow(1 - P, st.d - st.m) * pow(P, st.m);
      ans += p;
      continue;
    }

    if (out(st.r, st.l)) {
      continue;
    }

    if (st.d == K) {
      if (ok2(st.r, st.l)) {
        double p = pow(1 - P, st.d - st.m) * pow(P, st.m);
        ans += p;
        continue;
      }
      continue;
    }

    if (T <= H) {
      S.push(state(st.d + 1, st.r, H, st.m));
      S.push(state(st.d + 1, H, st.l, st.m + 1));
      continue;
    } else {
      S.push(state(st.d + 1, st.r, H, st.m + 1));
      S.push(state(st.d + 1, H, st.l, st.m));
      continue;
    }
  }

  printf("%.6f\\n", ans);
  return 0;
}