ABC304D A Piece of Cake

这是一道编程题,描述了如何在由直线分割的蛋糕块中找出草莓最多和最少的块。给定草莓坐标、分割线信息,使用map存储每个块的草莓数,通过结构体记录有草莓的块,最后通过枚举找到最大和最小草莓数的块。时间复杂度为O(nlogn)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ABC304D A Piece of Cake

题目大意

平面上有一个蛋糕以及 n n n个草莓,这些草莓的坐标分别为 p 1 , q 1 , p 2 , q 2 , … , p n , q n p_1,q_1,p_2,q_2,\dots,p_n,q_n p1,q1,p2,q2,,pn,qn

有下面若干条直线,将蛋糕分为

  • A A A条平行于 y y y轴的直线: x = a 1 , x = a 2 , … , x = a A x=a_1,x=a_2,\dots,x=a_A x=a1,x=a2,,x=aA
  • B B B条平行于 x x x轴的直线: y = b 1 , y = b 2 , … , y = b B y=b_1,y=b_2,\dots,y=b_B y=b1,y=b2,,y=bB

这些直线将蛋糕分为 ( A + 1 ) ( B + 1 ) (A+1)(B+1) (A+1)(B+1)份。

T T T要在这 ( A + 1 ) ( B + 1 ) (A+1)(B+1) (A+1)(B+1)块中选一块。请你告诉他草莓最多的一块和草莓最少的一块。保证没有草莓在块与块的边缘。

3 ≤ w , h ≤ 1 0 9 , 1 ≤ n ≤ 2 × 1 0 5 , 1 ≤ A , B ≤ 2 × 1 0 5 3\leq w,h\leq 10^9,1\leq n\leq 2\times 10^5,1\leq A,B\leq 2\times 10^5 3w,h109,1n2×105,1A,B2×105


题解

m a p map map来存每块蛋糕的草莓的数量,用一个结构体 t t t来存储有草莓的蛋糕的数量,再用 m a p map map来记录每块蛋糕是否加入了 t t t中。

t t t的长度不会超过 n n n,所以枚举 t t t中的蛋糕,找到草莓数量最多的。如果 t t t的长度小于 ( A + 1 ) ( B + 1 ) (A+1)(B+1) (A+1)(B+1),则总有一个蛋糕的草莓数量为 0 0 0,最小值为 0 0 0;否则枚举 t t t中的蛋糕,找到草莓数量最少的。

时间复杂度为 O ( n log ⁡ n ) O(n\log n) O(nlogn)

code

#include<bits/stdc++.h>
using namespace std;
int w,h,n,v1,v2,t1=0,m1,m2,x[200005],y[200005],a[200005],b[200005];
map<int,int>wt[200005],z[200005];
struct node{
	int x,y;
}t[1000005];
int main()
{
	scanf("%d%d%d",&w,&h,&n);
	for(int i=1;i<=n;i++){
		scanf("%d%d",&x[i],&y[i]);
	}
	scanf("%d",&v1);
	for(int i=1;i<=v1;i++){
		scanf("%d",&a[i]);
	}
	a[++v1]=2e9;
	scanf("%d",&v2);
	for(int i=1;i<=v2;i++){
		scanf("%d",&b[i]);
	}
	b[++v2]=2e9;
	for(int i=1;i<=n;i++){
		int d1,d2;
		d1=lower_bound(a+1,a+v1+1,x[i])-a;
		d2=lower_bound(b+1,b+v2+1,y[i])-b;
		++wt[d1][d2];
		if(!z[d1][d2]){
			t[++t1]=(node){d1,d2};
			z[d1][d2]=1;
		}
	}
	m1=2e9;m2=0;
	if(t1<1ll*v1*v2) m1=0;
	for(int i=1;i<=t1;i++){
		int vt=wt[t[i].x][t[i].y];
		m1=min(m1,vt);
		m2=max(m2,vt);
	}
	printf("%d %d",m1,m2);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值