思路:
http://blog.csdn.net/tc_to_top/article/details/51476095
代码:
#include <bits/stdc++.h>
using namespace std;
const int MAXN=1e6+7;
const int INF=0x3f3f3f3f;
int st[MAXN],en[MAXN],n,m;
bool judge(int mid){
int a=-INF,b=INF,c=-INF,d=INF;
bool flag=1;
for(int i=1;i<=n;i++){
if(en[i]-st[i]>mid){
flag=0;
a=max(st[i]+en[i]-mid,a);
b=min(st[i]+en[i]+mid,b);
c=max(st[i]-en[i]-mid,c);
d=min(st[i]-en[i]+mid,d);
}
}
if(flag) return 1;
if(b<a||d<c) return 0;
a+=c;b+=d;
b-=a;
return b>0||(b==0&&a%2==0);
}
int main(){
while(scanf("%d%d",&n,&m)!=-1){
for(int i=1;i<=m;i++){int x,y;
scanf("%d%d",&x,&y);if(x>y)swap(x,y);
st[i]=x;en[i]=y;
}
int le=0,ri=n,mid,ans;
while(le<=ri){
mid=(le+ri)/2;
if(judge(mid)){
ri=mid-1;
ans=mid;
}else{
le=mid+1;
}
}
printf("%d\n",ans);
}
}