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

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

typedef long long ll;
typedef long double ld;
typedef pair<ll, ll> pll;
typedef pair<ll, int> pli;
typedef pair<int, int> pii;
typedef pair<ll, ld> pld;
typedef pair<pii, int> ppiii;
typedef pair<pii, ll> ppiil;
typedef pair<pll, ll> pplll;
typedef pair<pli, int> pplii;
typedef vector<vector<ll>> vvl;
typedef vector<vector<int>> vvi;
typedef vector<vector<pll>> vvpll;
#define rep(i, a, b) for (ll i = (a); i < (b); i++)
#define rrep(i, a, b) for (ll i = (a); i > (b); i--)
#define pb push_back
#define tostr to_string
#define mkp make_pair
const ll INF = 1e18;
const ll MOD = 1e9 + 7;

void print(ld out) { cout << fixed << setprecision(12) << out << '\\n'; }
template <typename T> void print(T out) { cout << out << '\\n'; }
template <typename T1, typename T2> void print(pair<T1, T2> out) {
  cout << out.first << ' ' << out.second << '\\n';
}
template <typename T> void print(vector<T> A) {
  rep(i, 0, A.size()) {
    cout << A[i];
    cout << (i == A.size() - 1 ? '\\n' : ' ');
  }
}
template <typename T> void print(set<T> S) {
  vector<T> A(S.begin(), S.end());
  print(A);
}

template <typename T> inline bool chmax(T &x, T y) {
  return (y > x) ? x = y, true : false;
}
template <typename T> inline bool chmin(T &x, T y) {
  return (y < x) ? x = y, true : false;
}

ll sum(vector<ll> A) {
  ll res = 0;
  for (ll a : A)
    res += a;
  return res;
}
ll max(vector<ll> A) {
  ll res = -INF;
  for (ll a : A)
    chmax(res, a);
  return res;
}
ll min(vector<ll> A) {
  ll res = INF;
  for (ll a : A)
    chmin(res, a);
  return res;
}

ll toint(string s) {
  ll res = 0;
  for (char c : s) {
    res *= 10;
    res += (c - '0');
  }
  return res;
}
int toint(char c) { return c - '0'; }

inline ll pow(int x, ll n) {
  ll res = 1;
  rep(_, 0, n) res *= x;
  return res;
}
inline ll pow(ll x, ll n, int mod) {
  ll res = 1;
  while (n > 0) {
    if (n & 1) {
      res = (res * x) % mod;
    }
    x = (x * x) % mod;
    n >>= 1;
  }
  return res;
}

inline ll floor(ll a, ll b) {
  if (a < 0) {
    return (a - b + 1) / b;
  } else {
    return a / b;
  }
}
inline ll ceil(ll a, ll b) {
  if (a >= 0) {
    return (a + b - 1) / b;
  } else {
    return a / b;
  }
}

int popcount(ll S) { return __builtin_popcountll(S); }

ll bisearch_min(ll mn, ll mx, function<bool(ll)> func) {
  ll ok = mx;
  ll ng = mn;
  while (ng + 1 < ok) {
    ll mid = (ok + ng) / 2;
    if (func(mid)) {
      ok = mid;
    } else {
      ng = mid;
    }
  }
  return ok;
}

ll rec(ll x, ll X) {
  if (x > X)
    return 0;
  int last = x % 10;
  ll res = 0;
  res += rec(x * 10 + last, X);
  if (last != 0) {
    res += rec(x * 10 + (last - 1), X);
  }
  if (last != 9) {
    res += rec(x * 10 + (last + 1), X);
  }
  return res + 1;
}

ll K;

bool check(ll X) {
  ll res = 0;
  rep(i, 1, 10) { res += rec(i, X); }
  return res >= K;
}

int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);

  cin >> K;

  ll res = bisearch_min(0, 3234566668, check);
  print(res);
  return 0;
}


Error: TLE

Fixed submission:

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

typedef long long ll;
typedef long double ld;
typedef pair<ll, ll> pll;
typedef pair<ll, int> pli;
typedef pair<int, int> pii;
typedef pair<ll, ld> pld;
typedef pair<pii, int> ppiii;
typedef pair<pii, ll> ppiil;
typedef pair<pll, ll> pplll;
typedef pair<pli, int> pplii;
typedef vector<vector<ll>> vvl;
typedef vector<vector<int>> vvi;
typedef vector<vector<pll>> vvpll;
#define rep(i, a, b) for (ll i = (a); i < (b); i++)
#define rrep(i, a, b) for (ll i = (a); i > (b); i--)
#define pb push_back
#define tostr to_string
#define mkp make_pair
const ll INF = 1e18;
const ll MOD = 1e9 + 7;

void print(ld out) { cout << fixed << setprecision(12) << out << '\\n'; }
template <typename T> void print(T out) { cout << out << '\\n'; }
template <typename T1, typename T2> void print(pair<T1, T2> out) {
  cout << out.first << ' ' << out.second << '\\n';
}
template <typename T> void print(vector<T> A) {
  rep(i, 0, A.size()) {
    cout << A[i];
    cout << (i == A.size() - 1 ? '\\n' : ' ');
  }
}
template <typename T> void print(set<T> S) {
  vector<T> A(S.begin(), S.end());
  print(A);
}

template <typename T> inline bool chmax(T &x, T y) {
  return (y > x) ? x = y, true : false;
}
template <typename T> inline bool chmin(T &x, T y) {
  return (y < x) ? x = y, true : false;
}

ll sum(vector<ll> A) {
  ll res = 0;
  for (ll a : A)
    res += a;
  return res;
}
ll max(vector<ll> A) {
  ll res = -INF;
  for (ll a : A)
    chmax(res, a);
  return res;
}
ll min(vector<ll> A) {
  ll res = INF;
  for (ll a : A)
    chmin(res, a);
  return res;
}

ll toint(string s) {
  ll res = 0;
  for (char c : s) {
    res *= 10;
    res += (c - '0');
  }
  return res;
}
int toint(char c) { return c - '0'; }

inline ll pow(int x, ll n) {
  ll res = 1;
  rep(_, 0, n) res *= x;
  return res;
}
inline ll pow(ll x, ll n, int mod) {
  ll res = 1;
  while (n > 0) {
    if (n & 1) {
      res = (res * x) % mod;
    }
    x = (x * x) % mod;
    n >>= 1;
  }
  return res;
}

inline ll floor(ll a, ll b) {
  if (a < 0) {
    return (a - b + 1) / b;
  } else {
    return a / b;
  }
}
inline ll ceil(ll a, ll b) {
  if (a >= 0) {
    return (a + b - 1) / b;
  } else {
    return a / b;
  }
}

int popcount(ll S) { return __builtin_popcountll(S); }

ll bisearch_min(ll mn, ll mx, function<bool(ll)> func) {
  ll ok = mx;
  ll ng = mn;
  while (ng + 1 < ok) {
    ll mid = (ok + ng) / 2;
    if (func(mid)) {
      ok = mid;
    } else {
      ng = mid;
    }
  }
  return ok;
}

ll rec(string x, int di, ll X) {
  if (di == 10)
    return 0;
  if (toint(x) > X)
    return 0;
  int last = toint(x[x.size() - 1]);
  ll res = 0;
  res += rec(x + tostr(last), di + 1, X);
  if (last != 0) {
    res += rec(x + tostr(last - 1), di + 1, X);
  }
  if (last != 9) {
    res += rec(x + tostr(last + 1), di + 1, X);
  }
  return res + 1;
}

ll K;

bool check(ll X) {
  ll res = 0;
  rep(i, 1, 10) { res += rec(tostr(i), 0, X); }
  return res >= K;
}

int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);

  cin >> K;

  ll res = bisearch_min(0, 3234566668, check);
  print(res);
  return 0;
}