[思维题]51 Nod 1671——货物运输

题目描述

公元2222年,l国发生了一场战争。
小Y负责领导工人运输物资。
其中有m种物资的运输方案,每种运输方案形如li,ri。表示存在一种货物从li运到ri。
这里有n个城市,第i个城市与第i+1个城市相连(这里1号城市和n号城市并不相连),并且从i号城市走到i+1号或者从i+1号走到i号需要耗费1点时间。
由于高科技的存在,小Y想到了一种节省时间的好方案。在X号城市与Y号城市之间设立传送站,只要这么做,在X号城市走到Y号城市不需要耗费时间,同样的,从Y号城市走到X号城市也不需要耗费时间。
但是为了防止混乱,只能设立这么一条传送站。
现在这些运输方案同时进行,小Y想让最后到达目的地的运输方案时间最短。

解题思路

初看这题想到了NOIP某年的某题

这题显然要二分,考虑怎么验证。
先假设 s,t 之间有传送门,对于每个点我们可以列出 |xis|+|yit|<=w 这样的方程。

把所有路径和传送门转看成坐标上的点,那么传送门可选择的范围相对一个点形成一个斜着的正方形。

如果 w <script type="math/tex" id="MathJax-Element-203">w</script>可行,显然这些正方形需要存在交点。

对于这种正方形我们只需要关注两条斜边是否相交就可以了。

#include<cstdio>
#include<algorithm>
using namespace std;
char nc(){
    static char buf[100000],*l=buf,*r=buf;
    if (l==r) r=(l=buf)+fread(buf,1,100000,stdin);
    if (l==r) return EOF;return *l++;
}
inline int _read(){
    int num=0;char ch=nc();
    while(ch<'0'||ch>'9') ch=nc();
    while(ch>='0'&&ch<='9') num=num*10+ch-48,ch=nc();
    return  num;
}
const int maxn=500005,INF=2147483647;
struct jz{
    int x,y;
    bool operator<(const jz &b)const{return y-x<b.y-b.x;}
}a[maxn];
int n,m,L,R,mid;
bool check(int x){
    int s1=-INF,s2=-INF,t1=INF,t2=INF;
    for (int i=m;i>=1;i--)
    if (a[i].y-a[i].x>x){
        s1=max(s1,a[i].x+a[i].y-x);
        t1=min(t1,a[i].x+a[i].y+x);
        s2=max(s2,a[i].x-a[i].y-x);
        t2=min(t2,a[i].x-a[i].y+x);
    }else break;
    return s1<=t1&&s2<=t2;
}
int main(){
    freopen("exam.in","r",stdin);
    freopen("exam.out","w",stdout);
    n=_read();m=_read();
    for (int i=1;i<=m;i++){a[i].x=_read(),a[i].y=_read();if (a[i].x>a[i].y) swap(a[i].x,a[i].y);}
    sort(a+1,a+m+1);
    int L=0,R=a[m].y-a[m].x;
    while(L<=R){
        mid=L+(R-L>>1);
        if (check(mid)) R=mid-1;else L=mid+1;
    }
    printf("%d\n",L);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值