51nod1671
Posted 宣毅鸣
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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); }
以上是关于51nod1671的主要内容,如果未能解决你的问题,请参考以下文章