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

#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < (n); ++i)
#define sz(x) int(x.size())
#define ALL(c) (c).begin(), (c).end()
#define SUM(x) std::accumulate(ALL(x), 0LL)
#define MIN(v) *std::min_element(v.begin(), v.end())
#define MAX(v) *std::max_element(v.begin(), v.end())
#define EXIST(v, x) (std::find(v.begin(), v.end(), x) != v.end())

using namespace std;
using ll = long long;

template <class T> inline bool chmax(T &a, T b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
template <class T> inline bool chmin(T &a, T b) {
  if (a > b) {
    a = b;
    return true;
  }
  return false;
}
template <class T> inline void dump(vector<T> v) {
  for (auto &x : v)
    cerr << x << " ";
  cerr << endl;
}
template <class T> inline void dump(vector<pair<T, T>> v) {
  for (auto &p : v)
    cerr << p.first << " " << p.second << endl;
}
template <class T> inline void dump(vector<vector<T>> vv) {
  for (auto &v : vv) {
    for (auto &x : v)
      cerr << x << " ";
    cerr << endl;
  }
}

constexpr int INF = 1001001001;
constexpr long long INFL = (1LL << 60);
constexpr double eps = (1e-9);

using P = pair<int, int>;

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

  int h, w, m;
  cin >> h >> w >> m;
  vector<ll> nh(h, 0); // i 行に置いてある対象物
  vector<ll> nw(w, 0); // i 列に置いてある対象物

  set<P> t; // 対象物が置いてある座標

  rep(i, m) {
    int hh, ww;
    cin >> hh >> ww;
    hh--;
    ww--;
    nh[hh]++;
    nw[ww]++;
    t.insert({hh, ww});
  }

  map<ll, vector<int>> mph, mpw; // x 個破壊できる 行番号, 列番号

  rep(i, h) {
    int num = nh[i];
    mph[num].push_back(i);
  }
  rep(i, w) {
    int num = nw[i];
    mpw[num].push_back(i);
  }

  ll ans = 1;

  /*
    cerr << "hmax: " << hmax << "   wmax: " << wmax << endl;

    dump(nh);
    dump(nw);

    dump(mph.rbegin()->second);
    dump(mpw.rbegin()->second);
  */

  auto itrx = mph.rbegin();

  for (auto &x : itrx->second) {
    // x: 爆弾を置く行番号
    auto itry = mpw.rbegin();
    for (auto &y : itry->second) {
      // y: 爆弾を置く列番号
      if (t.count({x, y}) == 0) {
        cout << itrx->first + itry->first << endl;
        return 0;
      } else {
        chmax(ans, ll(itrx->first + itry->first - 1)); // 交点に対象物がある
      }
    }
  }

  auto itry = mpw.rbegin();
  for (auto &y : itry->second) {
    // y: 爆弾を置く列番号
    auto itrx = mph.rbegin();
    for (auto &x : itrx->second) {
      // x: 爆弾を置く行番号
      if (t.count({x, y}) == 0) {
        cout << itrx->first + itry->first << endl;
        return 0;
      } else {
        chmax(ans, ll(itrx->first + itry->first - 1)); // 交点に対象物がある
      }
    }
  }

  cout << ans << endl;

  return 0;
}


Error: TLE

Fixed submission:

#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < (n); ++i)
#define sz(x) int(x.size())
#define ALL(c) (c).begin(), (c).end()
#define SUM(x) std::accumulate(ALL(x), 0LL)
#define MIN(v) *std::min_element(v.begin(), v.end())
#define MAX(v) *std::max_element(v.begin(), v.end())
#define EXIST(v, x) (std::find(v.begin(), v.end(), x) != v.end())

using namespace std;
using ll = long long;

template <class T> inline bool chmax(T &a, T b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
template <class T> inline bool chmin(T &a, T b) {
  if (a > b) {
    a = b;
    return true;
  }
  return false;
}
template <class T> inline void dump(vector<T> v) {
  for (auto &x : v)
    cerr << x << " ";
  cerr << endl;
}
template <class T> inline void dump(vector<pair<T, T>> v) {
  for (auto &p : v)
    cerr << p.first << " " << p.second << endl;
}
template <class T> inline void dump(vector<vector<T>> vv) {
  for (auto &v : vv) {
    for (auto &x : v)
      cerr << x << " ";
    cerr << endl;
  }
}

constexpr int INF = 1001001001;
constexpr long long INFL = (1LL << 60);
constexpr double eps = (1e-9);

using P = pair<int, int>;

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

  int h, w, m;
  cin >> h >> w >> m;
  vector<ll> nh(h, 0); // i 行に置いてある対象物
  vector<ll> nw(w, 0); // i 列に置いてある対象物

  set<P> t; // 対象物が置いてある座標

  rep(i, m) {
    int hh, ww;
    cin >> hh >> ww;
    hh--;
    ww--;
    nh[hh]++;
    nw[ww]++;
    t.insert({hh, ww});
  }

  map<ll, vector<int>> mph, mpw; // x 個破壊できる 行番号, 列番号

  rep(i, h) {
    int num = nh[i];
    mph[num].push_back(i);
  }
  rep(i, w) {
    int num = nw[i];
    mpw[num].push_back(i);
  }

  ll ans = 1;

  /*
    cerr << "hmax: " << hmax << "   wmax: " << wmax << endl;

    dump(nh);
    dump(nw);

    dump(mph.rbegin()->second);
    dump(mpw.rbegin()->second);
  */

  auto itrx = mph.rbegin();

  for (auto &x : itrx->second) {
    // x: 爆弾を置く行番号
    auto itry = mpw.rbegin();
    for (auto &y : itry->second) {
      // y: 爆弾を置く列番号
      if (t.count({x, y}) == 0) {
        cout << itrx->first + itry->first << endl;
        return 0;
      } else {
        chmax(ans, ll(itrx->first + itry->first - 1)); // 交点に対象物がある
      }
    }
    itry++;
    if (itry == mpw.rend())
      continue;
    for (auto &y : itry->second) {
      // y: 爆弾を置く列番号
      if (t.count({x, y}) == 0) {
        chmax(ans, ll(itrx->first + itry->first));
      } else {
        chmax(ans, ll(itrx->first + itry->first - 1)); // 交点に対象物がある
      }
    }
  }

  auto itry = mpw.rbegin();
  for (auto &y : itry->second) {
    // y: 爆弾を置く列番号
    auto itrx = mph.rbegin();
    for (auto &x : itrx->second) {
      // x: 爆弾を置く行番号
      if (t.count({x, y}) == 0) {
        cout << itrx->first + itry->first << endl;
        return 0;
      } else {
        chmax(ans, ll(itrx->first + itry->first - 1)); // 交点に対象物がある
      }
    }
  }

  cout << ans << endl;

  return 0;
}