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

// デバッグ用オプション：-fsanitize=undefined,address

// コンパイラ最適化
#pragma GCC optimize("Ofast")

// インクルードなど
#include <algorithm>
#include <iostream>
#include <string>
using namespace std;
typedef long long ll;

// vector set 等
#include <map>
#include <set>
#include <vector>

// マクロ
//  forループ
// 引数は、(ループ内変数,動く範囲)か(ループ内変数,始めの数,終わりの数)、のどちらか
//  Dがついてないものはループ変数は1ずつインクリメントされ、Dがついてるものはループ変数は1ずつデクリメントされる
//  FORAは範囲for文(使いにくかったら消す)
#define REP(i, n) for (ll i = 0; i < ll(n); i++)
#define REPD(i, n) for (ll i = n - 1; i >= 0; i--)
#define FOR(i, a, b) for (ll i = a; i <= ll(b); i++)
#define FORD(i, a, b) for (ll i = a; i >= ll(b); i--)
#define FORA(i, I) for (const auto &i : I)
// xにはvectorなどのコンテナ
#define ALL(x) x.begin(), x.end()
#define SIZE(x) ll(x.size())
// 定数
#define INF 1000000000000 // 10^12:∞
#define MOD 1000000007    // 10^9+7:合同式の法
#define MAXR 100000       // 10^5:配列の最大のrange
// 略記
#define PB push_back // 挿入
#define MP make_pair // pairのコンストラクタ
#define F first      // pairの一つ目の要素
#define S second     // pairの二つ目の要素

// 負の数にも対応した % 演算
ll mod(ll x) {
  ll res = x % MOD;
  if (res < 0)
    x += MOD;
  return res;
}

ll mpow(ll x, ll n) {
  ll res = 1;
  while (n != 0) {
    if (n & 1)
      res = res * x % MOD;
    x = x * x % MOD;
    n = n >> 1;
  }
  return res;
}

// a^{-1} mod を計算する
ll minv(ll a) { return mpow(a, MOD - 2); }

signed main() {
  // 入力の高速化用のコード
  ios::sync_with_stdio(false);
  cin.tie(nullptr);

  int h, w, m, max_h, max_w, ans;
  max_h = 0;
  max_w = 0;

  cin >> h >> w >> m;

  vector<int> count_h(h + 10);
  vector<int> count_w(w + 10);

  map<int, map<int, bool>> masu{};

  int _h, _w;
  REP(i, m) {
    cin >> _h >> _w;
    count_h[_h] += 1;
    count_w[_w] += 1;
    masu[_w][_h] = true;
  }

  // cout <<max_w<< " -- "<<max_h<<endl;
  max_h = *max_element(ALL(count_h));
  max_w = *max_element(ALL(count_w));

  map<int, bool> mp;
  set<int> items_h, items_w;
  FOR(i, 1, w) {
    if (max_w == count_w[i]) {
      items_w.insert(i);
    }
  }
  FOR(i, 1, h) {
    if (max_h == count_h[i]) {
      items_h.insert(i);
    }
  }
  FORA(i_w, items_w) {
    mp = masu[i_w];
    FORA(i_h, items_h) {
      if (!mp[i_h]) {
        cout << max_h + max_w << endl;
        return 0;
      }
    }
  }
  cout << max_h + max_w - 1 << endl;
  return 0;
}


Error: TLE

Fixed submission:

// デバッグ用オプション：-fsanitize=undefined,address

// コンパイラ最適化
#pragma GCC optimize("Ofast")

// インクルードなど
#include <algorithm>
#include <iostream>
#include <string>
using namespace std;
typedef long long ll;

// vector set 等
#include <map>
#include <set>
#include <vector>

// マクロ
//  forループ
// 引数は、(ループ内変数,動く範囲)か(ループ内変数,始めの数,終わりの数)、のどちらか
//  Dがついてないものはループ変数は1ずつインクリメントされ、Dがついてるものはループ変数は1ずつデクリメントされる
//  FORAは範囲for文(使いにくかったら消す)
#define REP(i, n) for (ll i = 0; i < ll(n); i++)
#define REPD(i, n) for (ll i = n - 1; i >= 0; i--)
#define FOR(i, a, b) for (ll i = a; i <= ll(b); i++)
#define FORD(i, a, b) for (ll i = a; i >= ll(b); i--)
#define FORA(i, I) for (const auto &i : I)
// xにはvectorなどのコンテナ
#define ALL(x) x.begin(), x.end()
#define SIZE(x) ll(x.size())
// 定数
#define INF 1000000000000 // 10^12:∞
#define MOD 1000000007    // 10^9+7:合同式の法
#define MAXR 100000       // 10^5:配列の最大のrange
// 略記
#define PB push_back // 挿入
#define MP make_pair // pairのコンストラクタ
#define F first      // pairの一つ目の要素
#define S second     // pairの二つ目の要素

// 負の数にも対応した % 演算
ll mod(ll x) {
  ll res = x % MOD;
  if (res < 0)
    x += MOD;
  return res;
}

ll mpow(ll x, ll n) {
  ll res = 1;
  while (n != 0) {
    if (n & 1)
      res = res * x % MOD;
    x = x * x % MOD;
    n = n >> 1;
  }
  return res;
}

// a^{-1} mod を計算する
ll minv(ll a) { return mpow(a, MOD - 2); }

signed main() {
  // 入力の高速化用のコード
  ios::sync_with_stdio(false);
  cin.tie(nullptr);

  int h, w, m, max_h, max_w, ans;
  max_h = 0;
  max_w = 0;

  cin >> h >> w >> m;

  vector<int> count_h(h + 10);
  vector<int> count_w(w + 10);

  map<int, map<int, bool>> masu{};

  int _h, _w;
  REP(i, m) {
    cin >> _h >> _w;
    count_h[_h] += 1;
    count_w[_w] += 1;
    masu[_w][_h] = true;
  }

  // cout <<max_w<< " -- "<<max_h<<endl;
  max_h = *max_element(ALL(count_h));
  max_w = *max_element(ALL(count_w));

  map<int, bool> mp;
  FOR(i, 1, w) {
    // cout <<i<< " -- "<< count_h[i] <<endl;
    if (max_w == count_w[i]) {
      mp = masu[i];
      FOR(j, 1, h) {
        if (max_h == count_h[j]) {
          if (!mp[j]) {
            cout << max_h + max_w << endl;
            return 0;
          }
        }
      }
    }
  }
  cout << max_h + max_w - 1 << endl;
  return 0;
}