51nod1671

题解:

这一题感觉和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);
}
时间: 2024-09-14 13:31:49

51nod1671的相关文章

[51Nod1671] 货物运输

题意:给出1-n个点,i与i+1有权为1的边,有m个任务同时进行,你可以使用洪荒之力开一个传送门使某个点x到某个点y不需要代价,求完成所有任务的最小代价 题解: 二分+思维 嗯,如果抛开二分,这题基本上就是个纯思维题,乍一看很想运输计划的弱化版,但是运输计划断的是一条边,而这个题则是一条路径 二分最大路径长度,记下所有大于mid的路径,设传送门为(x,y),则这些路径的路线必定是:l -> x -> y -> r 于是我们考虑枚举x,对于某个任务,得出y的范围:mid-(abs(l-x)