D - A Piece of Cake( arc 304 二分

#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 (是迭代器不是元素

因为返回的是一个迭代器,所以要访问这个元素得加 *

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值