P7305 [COCI2018-2019#1] Cipele
[COCI2018-2019#1] Cipele
独立完成。
二分答案典题。
因为具有“最大值最小”这样明显的提示性词语,很容易想到二分答案,也就是二分丑陋度。
我们二分的丑陋度 ,就是对于这个序列来说,他的丑陋度的最大值不可以超过这个 ,看能不能成功。
我们先对这两个序列排序,然后对于 ,找到第一符合条件的数 ,因为序列是有序的,后面的 必然比现在的 大,所以和 以前的数做差也一定不会符合条件。因为 和他们做差已经不符合了,往后这个差值只会更大。所以下一次直接从 开始寻找就好了,时间为 。
最后注意我们默认要从数量少的那个序列在数量多的序列里面找。
#include<bits/stdc++.h>
using namespace std;
const int N =1e6+10;
#define int long long
int b[N],a[N],n,m;
bool check(int x){
int p=1;
for(int i=1;i<=n;i++){
if(p>m) return false;
while(abs(a[i]-b[p])>x){
if(i<n&&p>m) return false;
p++;
}
if(p>m) return false;
p++;
}
return true;
}
void Find(){
int l=0,r=1e10;
while(l<r){
int mid=(l+r)>>1;
if(check(mid)) r=mid;
else l=mid+1;
}
cout<<r<<endl;
return ;
}
signed main()
{
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=m;i++) cin>>b[i];
if(n>m){
for(int i=1;i<=n;i++) swap(a[i],b[i]);
swap(n,m);
}
sort(a+1,a+n+1),sort(b+1,b+m+1);
Find();
return 0;
}