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

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

typedef unsigned long long ull;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef pair<double, double> pdd;
// typedef vector<vector<ll>> Graph;

const ll mod = 1e9 + 7;
// const ll mod = 998244353;

#define REP(i, n) for (ll i = 0; i < (ll)n; i++)
#define dump(x) cerr << #x << " = " << (x) << endl;
#define spa << " " <<
#define fi first
#define se second

template <class T> bool chmax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T> bool chmin(T &a, const T &b) {
  if (a > b) {
    a = b;
    return 1;
  }
  return 0;
}

template <class S, class T>
ostream &operator<<(ostream &os, const pair<S, T> v) {
  os << "(" << v.first << ", " << v.second << ")";
  return os;
}
template <class T> ostream &operator<<(ostream &os, const vector<T> v) {
  for (int i = 0; i < (int)v.size(); i++) {
    if (i > 0) {
      os << " ";
    }
    os << v[i];
  }
  return os;
}
template <class T> ostream &operator<<(ostream &os, const vector<vector<T>> v) {
  for (int i = 0; i < (int)v.size(); i++) {
    if (i > 0) {
      os << endl;
    }
    os << v[i];
  }
  return os;
}

template <typename T> void debug(vector<vector<T>> &v, ll h, ll w) {
  for (ll i = 0; i < h; i++) {
    cerr << v[i][0];
    for (ll j = 1; j < w; j++)
      cerr spa v[i][j];
    cerr << endl;
  }
};
void debug(vector<string> &v, ll h, ll w) {
  for (ll i = 0; i < h; i++) {
    for (ll j = 0; j < w; j++)
      cerr << v[i][j];
    cerr << endl;
  }
};
template <typename T> void debug(vector<T> &v, ll n) {
  if (n != 0)
    cerr << v[0];
  for (ll i = 1; i < n; i++)
    cerr spa v[i];
  cerr << endl;
};

string num2bit(ll num, ll len) {
  string bit = "";
  REP(i, len) { bit += char('0' + (num >> i & 1)); }
  return bit;
}

struct neg {
  ll base, a, b;
  bool operator<(const neg &right) const { return base < right.base; }
};

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

  ll N;
  cin >> N;
  vector<string> S(N);
  REP(i, N) cin >> S[i];

  vector<pll> pos_task, neg_task;
  REP(i, N) {
    ll tomi = 0;
    ll tot = 0;
    REP(j, S[i].size()) {
      if (S[i][j] == '(')
        tot++;
      else
        tot--;

      chmin(tomi, tot);
    }

    ll x;
    if (tomi < 0)
      x = -tomi;
    else
      x = 0;
    ll y = tot;

    // dump(x)
    // dump(y)

    if (y >= 0)
      pos_task.push_back({x, y});
    else
      neg_task.push_back({x, y});
  }

  ll r = 0;
  sort(pos_task.begin(), pos_task.end());
  REP(i, pos_task.size()) {
    if (pos_task[i].first <= r) {
      r += pos_task[i].second;
    } else {
      cout << "No" << endl;
      return 0;
    }
  }

  ll m = neg_task.size();
  vector<neg> negs;
  REP(i, m) {
    neg tmp = {max(neg_task[i].first + neg_task[i].second, 0ll),
               neg_task[i].first, neg_task[i].second};
    negs.push_back(tmp);
  }

  sort(negs.rbegin(), negs.rend());
  REP(i, m) {
    if (negs[i].a <= r) {
      r += negs[i].b;
    } else {
      cout << "No" << endl;
      return 0;
    }
  }

  if (r == 0) {
    cout << "Yes" << endl;
  } else {
    cout << "No" << endl;
  }

  return 0;
}

Error: TLE

Fixed submission:

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

typedef unsigned long long ull;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef pair<double, double> pdd;
// typedef vector<vector<ll>> Graph;

const ll mod = 1e9 + 7;
// const ll mod = 998244353;

#define REP(i, n) for (ll i = 0; i < (ll)n; i++)
#define dump(x) cerr << #x << " = " << (x) << endl;
#define spa << " " <<
#define fi first
#define se second

template <class T> bool chmax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T> bool chmin(T &a, const T &b) {
  if (a > b) {
    a = b;
    return 1;
  }
  return 0;
}

template <class S, class T>
ostream &operator<<(ostream &os, const pair<S, T> v) {
  os << "(" << v.first << ", " << v.second << ")";
  return os;
}
template <class T> ostream &operator<<(ostream &os, const vector<T> v) {
  for (int i = 0; i < (int)v.size(); i++) {
    if (i > 0) {
      os << " ";
    }
    os << v[i];
  }
  return os;
}
template <class T> ostream &operator<<(ostream &os, const vector<vector<T>> v) {
  for (int i = 0; i < (int)v.size(); i++) {
    if (i > 0) {
      os << endl;
    }
    os << v[i];
  }
  return os;
}

template <typename T> void debug(vector<vector<T>> &v, ll h, ll w) {
  for (ll i = 0; i < h; i++) {
    cerr << v[i][0];
    for (ll j = 1; j < w; j++)
      cerr spa v[i][j];
    cerr << endl;
  }
};
void debug(vector<string> &v, ll h, ll w) {
  for (ll i = 0; i < h; i++) {
    for (ll j = 0; j < w; j++)
      cerr << v[i][j];
    cerr << endl;
  }
};
template <typename T> void debug(vector<T> &v, ll n) {
  if (n != 0)
    cerr << v[0];
  for (ll i = 1; i < n; i++)
    cerr spa v[i];
  cerr << endl;
};

string num2bit(ll num, ll len) {
  string bit = "";
  REP(i, len) { bit += char('0' + (num >> i & 1)); }
  return bit;
}

struct neg {
  ll base, a, b;
  bool operator<(const neg &right) const { return base < right.base; }
};

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

  ll N;
  cin >> N;
  vector<string> S(N);
  REP(i, N) cin >> S[i];

  vector<pll> pos_task, neg_task;
  REP(i, N) {
    ll tomi = 0;
    ll tot = 0;
    REP(j, S[i].size()) {
      if (S[i][j] == '(')
        tot++;
      else
        tot--;

      chmin(tomi, tot);
    }

    ll x;
    if (tomi < 0)
      x = -tomi;
    else
      x = 0;
    ll y = tot;

    dump(x) dump(y)

        if (y >= 0) pos_task.push_back({x, y});
    else neg_task.push_back({x, y});
  }

  ll r = 0;
  sort(pos_task.begin(), pos_task.end());
  REP(i, pos_task.size()) {
    if (pos_task[i].first <= r) {
      r += pos_task[i].second;
    } else {
      cout << "No" << endl;
      return 0;
    }
  }

  ll m = neg_task.size();
  vector<neg> negs;
  REP(i, m) {
    neg tmp = {max(neg_task[i].first + neg_task[i].second, 0ll),
               neg_task[i].first, neg_task[i].second};
    negs.push_back(tmp);
  }

  sort(negs.rbegin(), negs.rend());
  REP(i, m) {
    if (negs[i].a <= r) {
      r += negs[i].b;
    } else {
      cout << "No" << endl;
      return 0;
    }
  }

  if (r == 0) {
    cout << "Yes" << endl;
  } else {
    cout << "No" << endl;
  }

  return 0;
}