#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll w, h, n;
ll x[200010], y[200010];
ll a[200010], b[200010];
int main() {
cin >> w >> h >> n;
for (int i = 1; i <= n; i++) {
scanf("%lld %lld", &x[i], &y[i]);
}
int aa;
cin >> aa;
for (int i = 1; i <= aa; i++) {
scanf("%lld", &a[i]);
}
a[aa + 1] = w;//在边缘补一刀
int bb;
cin >> bb;
for (int i = 1; i <= bb; ++i) {
scanf("%lld", &b[i]);
}
b[bb + 1] = h;//边缘补一刀
map<pair<long, long >, ll> mp;
//遍历每个草莓,根据分割线进行二分,找到这个草莓的横纵坐标
//刚好不小于 某种切法的 位置。
for (int i = 1; i <= n; i++) {
ll xx = *lower_bound(a + 1, a + 2 + aa, x[i]);
ll yy = *lower_bound(b + 1, b + 2 + bb, y[i]);
mp[ {xx, yy}]++;
}
ll ansmax = 0 ;
ll ansmin = 0x3f3f3f3f ;
if (mp.size() < (aa + 1) * (bb + 1)) {
ansmin = 0;
}
for (auto it : mp) {
ansmax = max(ansmax, it.second);
ansmin = min(ansmin, it.second);
}
cout << ansmin << " " << ansmax;
}
根据刀法将 整个蛋糕划分成 a+1 * b+1 块,因此需要在边缘补上一刀
于是乎就可以用x y 来定位每块蛋糕的位置,每一刀的左边是是其所分配的蛋糕
由于分块的方法是单调递增的,所以可以采用二分的方法来查找草莓的应该位于哪一快
利用map存储 x , y 和该分块的草莓数量
对于每一个草莓,设座标为(q,p)查找首个 不小于草莓坐标的 分块, q<=x, p<=y;
那么该块草莓就在x,y这个分块中,数量++;
如果最后map的size 没有 a+1 * b+1 就代表有的分块没有草莓,min = 0 ;
遍历找最大
----------------------------------------------------------------------------------------
lower_bound 不小于查找值的首个元素的位置 及大于等于该值的元素位置
upper_bound 找到 大于 该值的 首个元素的位置
1 2 3 4 4 5 6 7 查找5
分别返回迭代器指向 5 , 6 (是迭代器不是元素
因为返回的是一个迭代器,所以要访问这个元素得加 *