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

#include <bits/stdc++.h>
#define PI acos(-1)
typedef long long ll;
using namespace std;

int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);

  int n, digits;
  double d = 0;
  ll prod = 1;
  cin >> n;
  for (int i = 0; i < n; i++) {
    ll value;
    cin >> value;
    prod = prod * value;
    d = d + log10(value);
  }
  digits = floor(d) + 1;
  if (digits > 19)
    cout << -1 << "\\n";
  else {
    if (prod > 1000000000000000000)
      cout << -1 << "\\n";
    else
      cout << prod << "\\n";
  }
}

Error: TLE

Fixed submission:

#include <bits/stdc++.h>
#define PI acos(-1)
typedef long long ll;
using namespace std;

struct Bigint {
  // representations and structures
  string a; // to store the digits
  int sign; // sign = -1 for negative numbers, sign = 1 otherwise
  // constructors
  Bigint() {}                       // default constructor
  Bigint(string b) { (*this) = b; } // constructor for string
  // some helpful methods
  int size() { // returns number of digits
    return a.size();
  }
  Bigint inverseSign() { // changes the sign
    sign *= -1;
    return (*this);
  }
  Bigint normalize(int newSign) { // removes leading 0, fixes sign
    for (int i = a.size() - 1; i > 0 && a[i] == '0'; i--)
      a.erase(a.begin() + i);
    sign = (a.size() == 1 && a[0] == '0') ? 1 : newSign;
    return (*this);
  }
  // assignment operator
  void operator=(string b) { // assigns a string to Bigint
    a = b[0] == '-' ? b.substr(1) : b;
    reverse(a.begin(), a.end());
    this->normalize(b[0] == '-' ? -1 : 1);
  }
  // conditional operators
  bool operator<(const Bigint &b) const { // less than operator
    if (sign != b.sign)
      return sign < b.sign;
    if (a.size() != b.a.size())
      return sign == 1 ? a.size() < b.a.size() : a.size() > b.a.size();
    for (int i = a.size() - 1; i >= 0; i--)
      if (a[i] != b.a[i])
        return sign == 1 ? a[i] < b.a[i] : a[i] > b.a[i];
    return false;
  }
  bool operator==(const Bigint &b) const { // operator for equality
    return a == b.a && sign == b.sign;
  }
  Bigint operator+(Bigint b) { // addition operator overloading
    if (sign != b.sign)
      return (*this) - b.inverseSign();
    Bigint c;
    for (int i = 0, carry = 0; i < a.size() || i < b.size() || carry; i++) {
      carry +=
          (i < a.size() ? a[i] - 48 : 0) + (i < b.a.size() ? b.a[i] - 48 : 0);
      c.a += (carry % 10 + 48);
      carry /= 10;
    }
    return c.normalize(sign);
  }
  Bigint operator-(Bigint b) { // subtraction operator overloading
    if (sign != b.sign)
      return (*this) + b.inverseSign();
    int s = sign;
    sign = b.sign = 1;
    if ((*this) < b)
      return ((b - (*this)).inverseSign()).normalize(-s);
    Bigint c;
    for (int i = 0, borrow = 0; i < a.size(); i++) {
      borrow = a[i] - borrow - (i < b.size() ? b.a[i] : 48);
      c.a += borrow >= 0 ? borrow + 48 : borrow + 58;
      borrow = borrow >= 0 ? 0 : 1;
    }
    return c.normalize(s);
  }
  Bigint operator*(Bigint b) { // multiplication operator overloading
    Bigint c("0");
    for (int i = 0, k = a[i] - 48; i < a.size(); i++, k = a[i] - 48) {
      while (k--)
        c = c + b;                  // ith digit is k, so, we add k times
      b.a.insert(b.a.begin(), '0'); // multiplied by 10
    }
    return c.normalize(sign * b.sign);
  }
  Bigint operator/(Bigint b) { // division operator overloading
    if (b.size() == 1 && b.a[0] == '0')
      b.a[0] /= (b.a[0] - 48);
    Bigint c("0"), d;
    for (int j = 0; j < a.size(); j++)
      d.a += "0";
    int dSign = sign * b.sign;
    b.sign = 1;
    for (int i = a.size() - 1; i >= 0; i--) {
      c.a.insert(c.a.begin(), '0');
      c = c + a.substr(i, 1);
      while (!(c < b))
        c = c - b, d.a[i]++;
    }
    return d.normalize(dSign);
  }
  Bigint operator%(Bigint b) { // modulo operator overloading
    if (b.size() == 1 && b.a[0] == '0')
      b.a[0] /= (b.a[0] - 48);
    Bigint c("0");
    b.sign = 1;
    for (int i = a.size() - 1; i >= 0; i--) {
      c.a.insert(c.a.begin(), '0');
      c = c + a.substr(i, 1);
      while (!(c < b))
        c = c - b;
    }
    return c.normalize(sign);
  }
  // output method
  void print() {
    if (sign == -1)
      putchar('-');
    for (int i = a.size() - 1; i >= 0; i--)
      putchar(a[i]);
  }
};

int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);

  int n;
  cin >> n;
  Bigint prod("1");
  Bigint mini("0");
  Bigint maxi("1000000000000000000");
  for (int i = 0; i < n; i++) {
    string v;
    cin >> v;
    Bigint V = v;
    prod = prod * V;
  }
  if (prod < mini || maxi < prod) {
    cout << -1 << "\\n";
  } else
    prod.print();
}