喵喵喵两次二分喵喵喵

喵喵喵两次二分喵喵喵

一道很妙的两次二分
不要问我怎么想到两次二分的
因为万物皆可二分

第一次二分乘积结果
第二次二分b中符合要求的个数

结果为什么就对了我也不知道
而且我盐重怀疑求得的答案不是a和b数组中的数乘起来的结果

代码

#include<bits/stdc++.h>
using namespace std;
#define in Read()
#define re register
#define NNN 100000
int n,m,k;
int a[NNN],b[NNN];

int in{
	int i=0,f=1;char ch='#';
	while((ch>'9'||ch<'0')&&ch!='-')ch=getchar();
	if(ch=='-'){
		ch=getchar();f=-1;
	}
	while(ch>='0'&&ch<='9')i=(i<<1)+(i<<3)+ch-48,ch=getchar();
	return i*f;
}

int add(int x,int now){
	int l=0,r=m,antimony;
	while(l<=r){
		int mid=(l+r)>>1;
		if(now*b[mid]>x)r=mid-1;
		else l=mid+1,antimony=mid;
	}
	return antimony;
}

int check(int x){
	int sum=0;
	for(re int i=1;i<=n;i++){
		sum+=add(x,a[i]);
	}
	return sum;
}

int main(){
	
	n=in,m=in,k=in;
	for(re int i=1;i<=n;i++)a[i]=in;
	for(re int i=1;i<=m;i++)b[i]=in;
	
	sort(a+1,a+n+1);
	sort(b+1,b+m+1);
	
	int l=a[1]*b[1],r=a[n]*b[m],ans;
	while(l<=r){
		int mid=(l+r+1)>>1;
		if(check(mid)>=k)r=mid-1,ans=mid;
		else l=mid+1;
	}
	printf("%d",ans);
	return 0;
}

还有一个问题
里面l和r怎么跳
一定要小心跳了之后会不会刚好把答案跳掉了
所以令一个Antimony=mid来存储

上一篇:洛谷P1049装箱问题(01背包)


下一篇:2.3 伯努利试验和直线上的随机游动