题解:

这一题感觉和noip2015d2t3一模一样,而且是弱化版

但是,后来发现貌似每两个点都可以建立虫洞

好在是i和i+1有边,所以就直接用二分+贪心了

代码:

#include<bits/stdc++.h>
const int N=1000005,inf=1<<30;
using namespace std;
int n,m,l[N],r[N];
bool check(int mid)
{
    int d1=-inf,d2=1<<30,c1=-inf,c2=1<<30;
    for(int i=1;i<=m;i++)
     {
        if(r[i]-l[i]<=mid) continue;
        d1=max(d1,l[i]+r[i]-mid);
        d2=min(d2,l[i]+r[i]+mid);
        c1=max(l[i]-r[i]-mid,c1);
        c2=min(l[i]-r[i]+mid,c2);
        if(d1>d2||c1>c2) return 0;
     }
    return 1;
}
int read()
{
    int x=0;char c;
    for (;c<'0'||c>'9';c=getchar());
    for (;c>='0'&&c<='9';c=getchar())x=x*10+c-48;
    return x;
}
int main()
{
    n=read();m=read();
    for(int i=1;i<=m;i++)
     {
         l[i]=read();r[i]=read();
         if (l[i]>r[i])swap(l[i],r[i]);
     }
    int l=0,r=n,ans=-1;
    while(l<r)
     {
        int mid=(l+r)/2;
        if(check(mid))r=mid;
        else l=mid+1;
     }
    printf("%d",l);
}

 

posted on 2017-09-23 09:05  宣毅鸣  阅读(202)  评论(0编辑  收藏  举报