競技プログラミング日記

主に AtCoder の記事です

AtCoder Beginner Contest 304D

ABC304D

ケーキの個数は (A+1)(B+1) 個なのでTLE. そこで,イチゴが1つ以上乗っているケーキの方だけ注目する. これは\(N\)個.

イチゴの座標が与えられたとき,どのケーキに乗るのかは, binary search で求まる.

各ケーキ毎にイチゴの個数を数えるが,それを直接配列で持つとMLE であるから, map : 座標 -> 個数 を使って求める.

合計で\(O(N log N)\).

使っている記号,マクロ等 "https://ecsmtlir.hatenablog.com/entry/2022/12/23/131925"

int main() {
  ll w,h ; cin >> w >> h;
  ll n; cin >> n;
  vll p(n), q(n);
  rep(i,n) cin >> p[i] >> q[i];

  ll a; cin >> a;
  vll va(a);
  va.push_back(0);
  rep(i,a) {
    ll x; cin >> x;
    va.push_back(x);
  }
  va.push_back(w);

  ll b; cin >> b;
  vll vb(b);
  vb.push_back(0);
  rep(i,b){
    ll y; cin >> y;
    vb.push_back(y);
  }
  vb.push_back(h);

  map<pll,ll> mp;

  rep(i,n){
    auto it0 = lower_bound(all(va), p[i]);
    auto it1 = lower_bound(all(vb), q[i]);

    ll j0 = it0 - va.begin();
    ll j1 = it1 - vb.begin();

    mp[{j0, j1}]++;
  }

  ll mi = INFL, ma = -INFL;
  for(auto [s,t]: mp){
    chmax(ma, t);
    chmin(mi, t);
  }
  if(mp.size() < (a+1)*(b+1)) mi = 0;
  cout << mi << " " << ma << endl;

  return 0;
}