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

/*input
11
0.9
1
1
1.25
2.30000
5
70
0.000000001
9999.999999999
0.999999999
1.000000001
*/
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
typedef tree<pair<int, int>, null_type, less<pair<int, int>>, rb_tree_tag,
             tree_order_statistics_node_update>
    indexed_set;
#pragma GCC optimize("unroll-loops,no-stack-protector")
// order_of_key #of elements less than x
//  find_by_order kth element
typedef long long int ll;
#define ld double
#define pii pair<ll, ll>
#define f first
#define s second
#define pb push_back
#define REP(i, n) for (ll i = 0; i < n; i++)
#define REP1(i, n) for (int i = 1; i <= n; i++)
#define FILL(n, x) memset(n, x, sizeof(n))
#define ALL(_a) _a.begin(), _a.end()
#define sz(x) (int)x.size()
const ll maxn = 1e5 + 5;
const ll maxlg = __lg(maxn) + 2;
const ll INF64 = 4e18;
const int INF = 0x3f3f3f3f;
const ll MOD = 1e9 + 7;
const ld PI = 3.14159265358979323846;
const ld eps = 1e-9;
#define lowb(x) x & (-x)
#define MNTO(x, y) x = min(x, (__typeof__(x))y)
#define MXTO(x, y) x = max(x, (__typeof__(x))y)
#define SORT_UNIQUE(c)                                                         \\
  (sort(c.begin(), c.end()),                                                   \\
   c.resize(distance(c.begin(), unique(c.begin(), c.end()))))
#define GET_POS(c, x) (lower_bound(c.begin(), c.end(), x) - c.begin())
#define MP make_pair
ll mult(ll a, ll b) {
  ll res = 0LL;
  while (b) {
    if (b & 1)
      res = (res + a) % MOD;
    a = (a + a) % MOD;
    b >>= 1;
  }
  return res % MOD;
}
ll mypow(ll a, ll b) {
  ll res = 1LL;
  while (b) {
    if (b & 1)
      res = res * a % MOD;
    a = a * a % MOD;
    b >>= 1;
  }
  return res;
}
int mp[50][20][10];
int32_t main() {
  ios::sync_with_stdio(false), cin.tie(0);
  int n;
  cin >> n;
  ll ans = 0;
  REP(i, n) {
    string s;
    cin >> s;
    int cnt = 0;
    REP(j, sz(s)) {
      if (s[j] == '.') {
        cnt = sz(s) - j - 1;
        s.erase(s.begin() + j);
        break;
      }
    }
    ll x = stoll(s);
    int two = 0, five = 0;
    while (x % 2 == 0) {
      x /= 2;
      ++two;
    }
    while (x % 5 == 0) {
      x /= 5;
      ++five;
    }

    REP(i, 47) {
      REP(j, 20) {
        // if(!sz(mp[i][j])) continue;
        int cur = min(i + two, j + five);
        // if(mp[i][j][max(min(cur-cnt,9),0)]) cout<<i<<' '<<j<<'\\n';
        int k = min(cur - cnt, 9);
        if (k < 0)
          continue;
        ans += mp[i][j][k];
      }
    }
    // cout<<ans<<'\\n';
    // cout<<sz(mp)<<'\\n';
    for (int j = cnt; j < 10; j++)
      mp[two][five][j]++;
  }
  cout << ans << '\\n';
}


Error: TLE

Fixed submission:

/*input
11
0.9
1
1
1.25
2.30000
5
70
0.000000001
9999.999999999
0.999999999
1.000000001
*/
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
typedef tree<pair<int, int>, null_type, less<pair<int, int>>, rb_tree_tag,
             tree_order_statistics_node_update>
    indexed_set;
#pragma GCC optimize("unroll-loops,no-stack-protector")
// order_of_key #of elements less than x
//  find_by_order kth element
typedef long long int ll;
#define ld double
#define pii pair<ll, ll>
#define f first
#define s second
#define pb push_back
#define REP(i, n) for (ll i = 0; i < n; i++)
#define REP1(i, n) for (int i = 1; i <= n; i++)
#define FILL(n, x) memset(n, x, sizeof(n))
#define ALL(_a) _a.begin(), _a.end()
#define sz(x) (int)x.size()
const ll maxn = 1e5 + 5;
const ll maxlg = __lg(maxn) + 2;
const ll INF64 = 4e18;
const int INF = 0x3f3f3f3f;
const ll MOD = 1e9 + 7;
const ld PI = 3.14159265358979323846;
const ld eps = 1e-9;
#define lowb(x) x & (-x)
#define MNTO(x, y) x = min(x, (__typeof__(x))y)
#define MXTO(x, y) x = max(x, (__typeof__(x))y)
#define SORT_UNIQUE(c)                                                         \\
  (sort(c.begin(), c.end()),                                                   \\
   c.resize(distance(c.begin(), unique(c.begin(), c.end()))))
#define GET_POS(c, x) (lower_bound(c.begin(), c.end(), x) - c.begin())
#define MP make_pair
ll mult(ll a, ll b) {
  ll res = 0LL;
  while (b) {
    if (b & 1)
      res = (res + a) % MOD;
    a = (a + a) % MOD;
    b >>= 1;
  }
  return res % MOD;
}
ll mypow(ll a, ll b) {
  ll res = 1LL;
  while (b) {
    if (b & 1)
      res = res * a % MOD;
    a = a * a % MOD;
    b >>= 1;
  }
  return res;
}
#define int ll
int32_t main() {
  ios::sync_with_stdio(false), cin.tie(0);
  int n;
  cin >> n;
  map<pii, indexed_set> mp;
  ll ans = 0;
  REP(i, n) {
    string s;
    cin >> s;
    int cnt = 0;
    REP(j, sz(s)) {
      if (s[j] == '.') {
        cnt = sz(s) - j - 1;
        s.erase(s.begin() + j);
        break;
      }
    }
    ll x = stoll(s);
    int two = 0, five = 0;
    while (x % 2 == 0) {
      x /= 2;
      ++two;
    }
    while (x % 5 == 0) {
      x /= 5;
      ++five;
    }
    for (auto x : mp) {
      int tt = x.f.f, ff = x.f.s;
      int cur = min(tt + two, ff + five);
      ans += x.s.order_of_key({cur - cnt + 1, -1});
    }
    mp[{two, five}].insert({cnt, i});
  }
  cout << ans << '\\n';
}