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

#include <bits/stdc++.h>
#define INF 1e9
using namespace std;

#define REPR(i, n) for (int i = (n); i >= 0; --i)
#define FOR(i, m, n) for (int i = (m); i < (n); ++i)
#define REP(i, n) for (int i = 0, i##_len = (n); i < i##_len; ++i)
#define ALL(a) (a).begin(), (a).end()
#define endl "\\n"

template <class T> bool chmin(T &a, const T &b) {
  if (b < a) {
    a = b;
    return true;
  }
  return false;
}
template <class T> bool chmax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
typedef long long ll;

void solve() {
  ll H, W, M;
  cin >> H >> W >> M;

  set<pair<int, int>> poss;
  map<int, int> h_cnt, w_cnt;

  REP(_, M) {
    int h, w;
    cin >> h >> w;

    poss.insert(make_pair(h, w));

    if (!h_cnt.count(h))
      h_cnt[h] = 1;
    else
      h_cnt[h]++;

    if (!w_cnt.count(w))
      w_cnt[w] = 1;
    else
      w_cnt[w]++;
  }

  // find max
  ll max_h = 0, max_w = 0;
  for (const auto &it : h_cnt)
    chmax(max_h, (ll)it.second);
  for (const auto &it : w_cnt)
    chmax(max_w, (ll)it.second);

  // 最大値と一致する列、行の数を見つける。
  vector<int> avail_h, avail_w;
  for (const auto &it : h_cnt)
    if (it.second == max_h)
      avail_h.push_back(it.first);
  for (const auto &it : w_cnt)
    if (it.second == max_w)
      avail_w.push_back(it.first);

  ll sz = avail_w.size() * avail_h.size();
  // もし最大値を取りうるマス数がWよりも大きければ、必ず max_h+max_w
  // となるマスがある。
  if (sz > M) {
    cout << max_h + max_w << endl;
    return;
  }

  // W以下なら探索を開始する。
  for (const auto &h : avail_h)
    for (const auto &w : avail_w) {
      if (!poss.count(make_pair(h, w))) {
        cout << max_h + max_w << endl;
        return;
      }
    }
  cout << max_h + max_w - 1 << endl;
}

int main() {
  solve();
  return 0;
}

Error: TLE

Fixed submission:

#include <bits/stdc++.h>
#define INF 1e9
#define INFLL 1ull << 60u
using namespace std;

#define REPR(i, n) for (int i = (n); i >= 0; --i)
#define FOR(i, m, n) for (int i = (m); i < (n); ++i)
#define REP(i, n) for (int i = 0, i##_len = (n); i < i##_len; ++i)
#define ALL(a) (a).begin(), (a).end()
#define endl "\\n"

template <class T> bool chmin(T &a, const T &b) {
  if (b < a) {
    a = b;
    return true;
  }
  return false;
}
template <class T> bool chmax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
typedef long long ll;

void solve() {
  int H, W, M;
  cin >> H >> W >> M;
  set<pair<int, int>> sp;
  map<int, int> h, w;

  REP(_, M) {
    int hh, ww;
    cin >> hh >> ww;
    if (!h.count(hh))
      h[hh] = 1;
    else
      h[hh]++;
    if (!w.count(ww))
      w[ww] = 1;
    else
      w[ww]++;

    sp.insert(make_pair(hh, ww));
  }

  int mxh = 0;
  int ih = -1;
  for (const auto _h : h) {
    if (chmax(mxh, _h.second))
      ih = _h.first;
  }

  int mxw = 0;
  int iw = -1;
  for (const auto _w : w) {
    if (chmax(mxw, int(_w.second - sp.count(make_pair(ih, _w.first)))))
      iw = _w.first;
  }

  ll ans = mxh + mxw;

  // cerr << ih << " " << iw << endl;
  for (const auto _h : h) {
    if (_h.second == mxh && _h.first != ih) {
      mxw = 0;
      iw = -1;
      for (const auto _w : w) {
        if (chmax(mxw,
                  int(_w.second - sp.count(make_pair(_h.first, _w.first)))))
          iw = _w.first;
      }
      chmax(ans, (ll)mxh + mxw);
    }
  }
  cout << ans << endl;
}

int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  solve();
  return 0;
}