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 3≤w,h≤109,1≤n≤2×105,1≤A,B≤2×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中的蛋糕,找到草莓数量最少的。文章来源:https://www.toymoban.com/news/detail-475723.html
时间复杂度为 O ( n log n ) O(n\log n) O(nlogn)。文章来源地址https://www.toymoban.com/news/detail-475723.html
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;
}
到了这里,关于ABC304D A Piece of Cake的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!