这个仅仅是讨论,ok!
4 个赞
???
3 个赞
#include<bits/stdc++.h>
using namespace std;
int n,m,s,a[10000001][2],b[10000001][2],c[1001][1001],ans;
int main(){
cin>>n>>m>>s;
for(int i=1;i<=n;++i){
cin>>a[i][0]>>a[i][1];
}
for(int i=1;i<=m;++i){
cin>>b[i][0]>>b[i][1];
}
while(1){
memset(c,0,sizeof(c));
for(int i=1;i<=n;++i){
++c[a[i][0]][a[i][1]];
}
int t=0;
for(int i=1;i<=m;++i){
for(int j=b[i][0]-ans;j<=b[i][0]+ans;++j){
for(int k=b[i][1]-ans;k<=b[i][1]+ans;++k){
if(j>=1&&j<=s&&k>=1&&k<=s){
if(c[j][k]==1){
c[j][k]=0;
++t;
}
}
}
}
}
if(t==n){
cout<<ans;
break;
}
++ans;
}
return 0;
}
3 个赞
二分+二维差分+二维前缀和,O(s^2logs)的,考场写的就是正解
4 个赞
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,m,s,max=0,num=0,l,r,mid;
cin>>n>>m>>s;
int ax[n],ay[n],bx[m],by[m];
for(int i=0;i<n;i++)
{
cin>>ax[i]>>ay[i];
if(ax[i]>max) max=ax[i];
if(ay[i]>max) max=ay[i];
}
for(int i=0;i<m;i++)
cin>>bx[i]>>by[i];
l=0;r=max;
while(l<r)
{
mid=l+r>>1;
num=0;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
if(abs(ax[i]-bx[j])<=mid&&abs(ay[i]-by[j])<=mid)
{
num++;
break;
}
}
if(num<n) l=mid+1;
else r=mid;
}
cout<<l;
return 0;
}
前面代码有点笨,主要是二分,套3个循环TLE
3 个赞
#include<bits/stdc++.h>
using namespace std;
int n,m,s;
struct xx{
int x,y;
};
xx a[1000001];
xx b[1000001];
bool v[1001][1001];
bool f(int z){
bool bbj=0;
for(int i=1;i<=n;i++){
bool sbj=0;
for(int j=1;j<=m;j++){
if(a[i].x<=b[j].x+z&&a[i].x>=b[j].x-z){
if(a[i].y<=b[j].y+z&&a[i].y>=b[j].y-z){
sbj=1;
break;
}
}
}
if(sbj==0){
bbj=1;
break;
}
}
if(bbj==0) return 1;
else return 0;
}
int main(){
cin>>n>>m>>s;
for(int i=1;i<=n;i++){
scanf("%d%d",&a[i].x,&a[i].y);
}
for(int j=1;j<=m;j++){
scanf("%d%d",&b[j].x,&b[j].y);
}
int l=0,r=s,mid;
while(l<r){
mid=(l+r)/2;
if(f(mid)==1) r=mid;
else l=mid+1;
}
cout<<l;
return 0;
}
3 个赞