首页 > 代码库 > 51nod———货物运输 解题报告

51nod———货物运输 解题报告

公元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想让最后到达目的地的运输方案时间最短。
 
在样例中,存在两条运输方案,分别是1号城市到3号与2号到4号,那么我们在2号城市与3号城市建立传送站,这样运输方案时间最长的只需要1点时间就可以了。
Input
第一行两个整数n,m(1<=n,m<=500000)。
接下来m行,每行两个整数li,ri(1<=li,ri<=n)。(若li=ri,则不需要耗费任何时间)
Output
一个数表示答案。
Input示例
5 2
1 3
2 4
Output示例
1
代码

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<cmath>
#include<cstdio>
#include<bitset>
#include<string>
#include<vector>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<functional>
using namespace std;
typedef __int64 LL;
const int low(int x) { return x&-x; }
const int INF = 0x7FFFFFFF;
const int mod = 1e9 + 7;
const int maxn = 1e6 + 10;
int n, L[maxn], R[maxn], m;
bool check(int d)
{
int l=-2*n,ll=-2*n;
int r=3*n,rr=3*n;
for (int i=1;i<=m;i++)
{
if(R[i]-L[i]<=d) continue;
l=max(l,L[i]+R[i]-d);
r=min(r,L[i]+R[i]+d);
ll=max(ll,L[i]-R[i]-d);
rr=min(rr,L[i]-R[i]+d);
}
return l==r&&ll==rr?!(l+ll&1):l<=r&&ll<=rr;
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
for(int i=1;i<=m;i++)
{
scanf("%d%d",&L[i],&R[i]);
if(L[i]>R[i]) swap(L[i],R[i]);
}
int q=0, h=n;
while(q<=h)
{
int mid=q+h>>1;
if(check(mid))h=mid-1;else q=mid+1;
}
printf("%d\n",q);
}
return 0;
}

51nod———货物运输 解题报告