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

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

using ll = long long;
#define int ll

#define rng(i, a, b) for (int i = int(a); i < int(b); i++)
#define rep(i, b) rng(i, 0, b)
#define gnr(i, a, b) for (int i = int(b) - 1; i >= int(a); i--)
#define per(i, b) gnr(i, 0, b)
#define pb push_back
#define eb emplace_back
#define a first
#define b second
#define bg begin()
#define ed end()
#define all(x) x.bg, x.ed
#define si(x) int(x.size())
#ifdef LOCAL
#define dmp(x) cerr << __LINE__ << " " << #x << " " << x << endl
#else
#define dmp(x) void(0)
#endif

template <class t, class u> void chmax(t &a, u b) {
  if (a < b)
    a = b;
}
template <class t, class u> void chmin(t &a, u b) {
  if (b < a)
    a = b;
}

template <class t> using vc = vector<t>;
template <class t> using vvc = vc<vc<t>>;

using pi = pair<int, int>;
using vi = vc<int>;

template <class t, class u>
ostream &operator<<(ostream &os, const pair<t, u> &p) {
  return os << "{" << p.a << "," << p.b << "}";
}

template <class t> ostream &operator<<(ostream &os, const vc<t> &v) {
  os << "{";
  for (auto e : v)
    os << e << ",";
  return os << "}";
}

#define mp make_pair
#define mt make_tuple
#define one(x) memset(x, -1, sizeof(x))
#define zero(x) memset(x, 0, sizeof(x))
#ifdef LOCAL
void dmpr(ostream &os) { os << endl; }
template <class T, class... Args>
void dmpr(ostream &os, const T &t, const Args &...args) {
  os << t << " ";
  dmpr(os, args...);
}
#define dmp2(...) dmpr(cerr, __LINE__, ##__VA_ARGS__)
#else
#define dmp2(...) void(0)
#endif

using uint = unsigned;
using ull = unsigned long long;

template <class t, size_t n>
ostream &operator<<(ostream &os, const array<t, n> &a) {
  return os << vc<t>(all(a));
}

template <int i, class T> void print_tuple(ostream &, const T &) {}

template <int i, class T, class H, class... Args>
void print_tuple(ostream &os, const T &t) {
  if (i)
    os << ",";
  os << get<i>(t);
  print_tuple<i + 1, T, Args...>(os, t);
}

template <class... Args>
ostream &operator<<(ostream &os, const tuple<Args...> &t) {
  os << "{";
  print_tuple<0, tuple<Args...>, Args...>(os, t);
  return os << "}";
}

template <class t> void print(t x, int suc = 1) {
  cout << x;
  if (suc == 1)
    cout << "\\n";
  if (suc == 2)
    cout << " ";
}

ll read() {
  ll i;
  cin >> i;
  return i;
}

vi readvi(int n, int off = 0) {
  vi v(n);
  rep(i, n) v[i] = read() + off;
  return v;
}

template <class T> void print(const vector<T> &v, int suc = 1) {
  rep(i, v.size()) print(v[i], i == int(v.size()) - 1 ? suc : 2);
}

string readString() {
  string s;
  cin >> s;
  return s;
}

template <class T> T sq(const T &t) { return t * t; }

// #define CAPITAL
void yes(bool ex = true) {
#ifdef CAPITAL
  cout << "YES"
       << "\\n";
#else
  cout << "Yes"
       << "\\n";
#endif
  if (ex)
    exit(0);
}
void no(bool ex = true) {
#ifdef CAPITAL
  cout << "NO"
       << "\\n";
#else
  cout << "No"
       << "\\n";
#endif
  if (ex)
    exit(0);
}
void possible(bool ex = true) {
#ifdef CAPITAL
  cout << "POSSIBLE"
       << "\\n";
#else
  cout << "Possible"
       << "\\n";
#endif
  if (ex)
    exit(0);
}
void impossible(bool ex = true) {
#ifdef CAPITAL
  cout << "IMPOSSIBLE"
       << "\\n";
#else
  cout << "Impossible"
       << "\\n";
#endif
  if (ex)
    exit(0);
}

constexpr ll ten(int n) { return n == 0 ? 1 : ten(n - 1) * 10; }

const ll infLL = LLONG_MAX / 3;

#ifdef int
const int inf = infLL;
#else
const int inf = INT_MAX / 2 - 100;
#endif

int topbit(signed t) { return t == 0 ? -1 : 31 - __builtin_clz(t); }
int topbit(ll t) { return t == 0 ? -1 : 63 - __builtin_clzll(t); }
int botbit(signed a) { return a == 0 ? 32 : __builtin_ctz(a); }
int botbit(ll a) { return a == 0 ? 64 : __builtin_ctzll(a); }
int popcount(signed t) { return __builtin_popcount(t); }
int popcount(ll t) { return __builtin_popcountll(t); }
bool ispow2(int i) { return i && (i & -i) == i; }
ll mask(int i) { return (ll(1) << i) - 1; }

bool inc(int a, int b, int c) { return a <= b && b <= c; }

template <class t> void mkuni(vc<t> &v) {
  sort(all(v));
  v.erase(unique(all(v)), v.ed);
}

ll rand_int(ll l, ll r) { //[l, r]
#ifdef LOCAL
  static mt19937_64 gen;
#else
  static mt19937_64 gen(chrono::steady_clock::now().time_since_epoch().count());
#endif
  return uniform_int_distribution<ll>(l, r)(gen);
}

template <class t> void myshuffle(vc<t> &a) {
  rep(i, si(a)) swap(a[i], a[rand_int(0, i)]);
}

template <class t> int lwb(const vc<t> &v, const t &a) {
  return lower_bound(all(v), a) - v.bg;
}

int gcd(int a, int b) {
  if (a < 0)
    a = -a;
  if (b < 0)
    b = -b;
  if (a == 0)
    return b;
  if (b == 0)
    return a;
  int s = botbit(a | b);
  a >>= botbit(a);
  do {
    b >>= botbit(b);
    if (a > b)
      swap(a, b);
    b -= a;
  } while (b);
  return a << s;
}

pi sub(pi a, pi b) { return pi(a.a - b.a, a.b - b.b); }

int crs(pi a, pi b) { return a.a * b.b - a.b * b.a; }

int tri2(pi a, pi b, pi c) { return abs(crs(sub(c, a), sub(b, a))); }

signed main() {
  cin.tie(0);
  ios::sync_with_stdio(0);
  cout << fixed << setprecision(20);

  int h, w, k;
  cin >> h >> w >> k;
  int ans = 0;
  rep(_, 2) {
    rng(left, 1, h) {
      rep(dif, w - 1) {
        if (tri2(pi(0, left), pi(1 + dif, 0), pi(1, h)) > (k + h) * 2)
          break;
        int lw = 0, up = w - dif;
        int base = gcd(h, dif);
        while (up - lw > 1) {
          const int mid = (lw + up) / 2;
          int t = tri2(pi(0, left), pi(mid + dif, 0), pi(mid, h));
          bool ok = false;
          if (t <= (k + h) * 2) {
            t -= base;
            t -= gcd(left, mid + dif);
            t -= gcd(h - left, mid);
            t += 2;
            if (t / 2 <= k)
              ok = true;
          }
          if (ok)
            lw = mid;
          else
            up = mid;
        }
        ans += lw;
        if (dif > 0)
          ans += lw;
      }
    }

    swap(h, w);
  }
  print(ans * 2);
}


Error: TLE

Fixed submission:

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

using ll = long long;
#define int ll

#define rng(i, a, b) for (int i = int(a); i < int(b); i++)
#define rep(i, b) rng(i, 0, b)
#define gnr(i, a, b) for (int i = int(b) - 1; i >= int(a); i--)
#define per(i, b) gnr(i, 0, b)
#define pb push_back
#define eb emplace_back
#define a first
#define b second
#define bg begin()
#define ed end()
#define all(x) x.bg, x.ed
#define si(x) int(x.size())
#ifdef LOCAL
#define dmp(x) cerr << __LINE__ << " " << #x << " " << x << endl
#else
#define dmp(x) void(0)
#endif

template <class t, class u> void chmax(t &a, u b) {
  if (a < b)
    a = b;
}
template <class t, class u> void chmin(t &a, u b) {
  if (b < a)
    a = b;
}

template <class t> using vc = vector<t>;
template <class t> using vvc = vc<vc<t>>;

using pi = pair<int, int>;
using vi = vc<int>;

template <class t, class u>
ostream &operator<<(ostream &os, const pair<t, u> &p) {
  return os << "{" << p.a << "," << p.b << "}";
}

template <class t> ostream &operator<<(ostream &os, const vc<t> &v) {
  os << "{";
  for (auto e : v)
    os << e << ",";
  return os << "}";
}

#define mp make_pair
#define mt make_tuple
#define one(x) memset(x, -1, sizeof(x))
#define zero(x) memset(x, 0, sizeof(x))
#ifdef LOCAL
void dmpr(ostream &os) { os << endl; }
template <class T, class... Args>
void dmpr(ostream &os, const T &t, const Args &...args) {
  os << t << " ";
  dmpr(os, args...);
}
#define dmp2(...) dmpr(cerr, __LINE__, ##__VA_ARGS__)
#else
#define dmp2(...) void(0)
#endif

using uint = unsigned;
using ull = unsigned long long;

template <class t, size_t n>
ostream &operator<<(ostream &os, const array<t, n> &a) {
  return os << vc<t>(all(a));
}

template <int i, class T> void print_tuple(ostream &, const T &) {}

template <int i, class T, class H, class... Args>
void print_tuple(ostream &os, const T &t) {
  if (i)
    os << ",";
  os << get<i>(t);
  print_tuple<i + 1, T, Args...>(os, t);
}

template <class... Args>
ostream &operator<<(ostream &os, const tuple<Args...> &t) {
  os << "{";
  print_tuple<0, tuple<Args...>, Args...>(os, t);
  return os << "}";
}

template <class t> void print(t x, int suc = 1) {
  cout << x;
  if (suc == 1)
    cout << "\\n";
  if (suc == 2)
    cout << " ";
}

ll read() {
  ll i;
  cin >> i;
  return i;
}

vi readvi(int n, int off = 0) {
  vi v(n);
  rep(i, n) v[i] = read() + off;
  return v;
}

template <class T> void print(const vector<T> &v, int suc = 1) {
  rep(i, v.size()) print(v[i], i == int(v.size()) - 1 ? suc : 2);
}

string readString() {
  string s;
  cin >> s;
  return s;
}

template <class T> T sq(const T &t) { return t * t; }

// #define CAPITAL
void yes(bool ex = true) {
#ifdef CAPITAL
  cout << "YES"
       << "\\n";
#else
  cout << "Yes"
       << "\\n";
#endif
  if (ex)
    exit(0);
}
void no(bool ex = true) {
#ifdef CAPITAL
  cout << "NO"
       << "\\n";
#else
  cout << "No"
       << "\\n";
#endif
  if (ex)
    exit(0);
}
void possible(bool ex = true) {
#ifdef CAPITAL
  cout << "POSSIBLE"
       << "\\n";
#else
  cout << "Possible"
       << "\\n";
#endif
  if (ex)
    exit(0);
}
void impossible(bool ex = true) {
#ifdef CAPITAL
  cout << "IMPOSSIBLE"
       << "\\n";
#else
  cout << "Impossible"
       << "\\n";
#endif
  if (ex)
    exit(0);
}

constexpr ll ten(int n) { return n == 0 ? 1 : ten(n - 1) * 10; }

const ll infLL = LLONG_MAX / 3;

#ifdef int
const int inf = infLL;
#else
const int inf = INT_MAX / 2 - 100;
#endif

int topbit(signed t) { return t == 0 ? -1 : 31 - __builtin_clz(t); }
int topbit(ll t) { return t == 0 ? -1 : 63 - __builtin_clzll(t); }
int botbit(signed a) { return a == 0 ? 32 : __builtin_ctz(a); }
int botbit(ll a) { return a == 0 ? 64 : __builtin_ctzll(a); }
int popcount(signed t) { return __builtin_popcount(t); }
int popcount(ll t) { return __builtin_popcountll(t); }
bool ispow2(int i) { return i && (i & -i) == i; }
ll mask(int i) { return (ll(1) << i) - 1; }

bool inc(int a, int b, int c) { return a <= b && b <= c; }

template <class t> void mkuni(vc<t> &v) {
  sort(all(v));
  v.erase(unique(all(v)), v.ed);
}

ll rand_int(ll l, ll r) { //[l, r]
#ifdef LOCAL
  static mt19937_64 gen;
#else
  static mt19937_64 gen(chrono::steady_clock::now().time_since_epoch().count());
#endif
  return uniform_int_distribution<ll>(l, r)(gen);
}

template <class t> void myshuffle(vc<t> &a) {
  rep(i, si(a)) swap(a[i], a[rand_int(0, i)]);
}

template <class t> int lwb(const vc<t> &v, const t &a) {
  return lower_bound(all(v), a) - v.bg;
}

// #define GEOF

#ifdef GEOF
using ld = long double;
#else
using ld = ll;
#endif
using cm = complex<ld>;
#define x real()
#define y imag()
const ld eps = 1e-8;
#ifdef GEOF
const ld PI = acos(ld(-1));
#endif
int sgn(ld a) { return a < -eps ? -1 : (a > eps ? 1 : 0); }
ld rabs(cm a) { return max(abs(a.x), abs(a.y)); }
ld signed_rabs(cm a) {
  if (abs(a.x) > abs(a.y))
    return a.x;
  else
    return a.y;
}
ld dot(cm a, cm b) { return a.x * b.x + a.y * b.y; }
ld crs(cm a, cm b) { return a.x * b.y - a.y * b.x; }
ld crs(cm a, cm b, cm c) { return crs(b - a, c - a); }
int ccw(cm a, cm b) { return sgn(crs(a, b)); }
int ccw(cm a, cm b, cm c) { return ccw(b - a, c - a); }
auto cmless = [](cm a, cm b) {
  int s = sgn(a.x - b.x);
  if (s)
    return s < 0;
  else
    return sgn(a.y - b.y) < 0;
};
bool cmeq(cm a, cm b) { return sgn(a.x - b.x) == 0 && sgn(a.y - b.y) == 0; };
//(-pi,0](0,pi]
int argtype(cm a) {
  if (sgn(a.y) == 0)
    return a.x < 0 ? 1 : 0;
  return a.y < 0 ? 0 : 1;
}
int argcmp(cm a, cm b) {
  int at = argtype(a), bt = argtype(b);
  if (at != bt)
    return at < bt ? -1 : 1;
  return -ccw(a, b);
};
bool argless(cm a, cm b) { return argcmp(a, b) < 0; }
//(-2)[a,-1](0)[b,1](2)
int bet(cm a, cm b, cm c) {
  cm d = b - a;
  ld e = dot(d, c - a);
  if (sgn(e) <= 0)
    return sgn(e) - 1;
  return sgn(e - norm(d)) + 1;
}
// AOJ0153
// 0-no,1-edge,2-in
int cont(cm a, cm b, cm c, cm d) {
  if (ccw(a, b, c) == -1)
    swap(b, c);
  return min({ccw(a, b, d), ccw(b, c, d), ccw(c, a, d)}) + 1;
}
#ifdef GEOF
// AOJ1183
int qeq(ld a, ld b, ld c, ld &d, ld &e) {
  ld f = b * b - 4 * a * c;
  if (sgn(f) < 0)
    return 0;
  ld g = sqrt(max(f, ld(0)));
  d = (-b + g) / (2 * a);
  e = (-b - g) / (2 * a);
  return sgn(f) + 1;
}
// AOJ1183
// arg between ab
// assume given lengths are valid
ld arg(ld a, ld b, ld c) {
  return acos(min(max((a * a + b * b - c * c) / (2 * a * b), ld(-1)), ld(1)));
}
// AOJ2233
// a->b->c と進むときに曲がる角度
// a-b-cが一直線上にあれば0が帰る
ld turn(cm a, cm b, cm c) { return arg((c - b) / (b - a)); }
#endif
cm rot90(cm a) { return cm(-a.y, a.x); }
/*
#ifndef GEOF
int gcd(int a,int b){return b?gcd(b,a%b):a;}
cm normdir(cm a){
        if(a==cm(0,0))return a;
        int g=gcd(abs(a.x),abs(a.y));
        return cm(a.x/g,a.y/g);
}
#endif*/
int gcd(int a, int b) {
  dmp2(a, b);
  if (a < 0)
    a = -a;
  if (b < 0)
    b = -b;
  if (a == 0)
    return b;
  if (b == 0)
    return a;
  int s = botbit(a | b);
  a >>= botbit(a);
  do {
    b >>= botbit(b);
    if (a > b)
      swap(a, b);
    b -= a;
  } while (b);
  dmp((a << s));
  return a << s;
}

int interior(cm a, cm b, cm c) {
  int ans = abs(crs(a, b, c));
  dmp(ans);
  ans -= gcd(a.x - b.x, a.y - b.y);
  dmp(ans);
  ans -= gcd(b.x - c.x, b.y - c.y);
  dmp(ans);
  ans -= gcd(c.x - a.x, c.y - a.y);
  dmp(ans);
  ans += 2;
  dmp2(a, b, c, ans);
  return ans / 2;
}

signed main() {
  cin.tie(0);
  ios::sync_with_stdio(0);
  cout << fixed << setprecision(20);

  int h, w, k;
  cin >> h >> w >> k;
  int ans = 0;
  rep(_, 2) {
    rng(left, 1, h) {
      int seq = 0;
      rep(dif, w - 1) {
        int lw = 0, up = w - dif;
        while (up - lw > 1) {
          const int mid = (lw + up) / 2;
          if (interior(cm(0, left), cm(mid + dif, 0), cm(mid, h)) <= k)
            lw = mid;
          else
            up = mid;
        }
        if (lw == 0 && left < h - 100) {
          seq++;
          if (seq == 100)
            break;
        }
        ans += lw;
        if (dif > 0)
          ans += lw;
      }
    }

    swap(h, w);
  }
  print(ans * 2);
}