首页 > 代码库 > 51nod———货物运输 解题报告
51nod———货物运输 解题报告
第一行两个整数n,m(1<=n,m<=500000)。 接下来m行,每行两个整数li,ri(1<=li,ri<=n)。(若li=ri,则不需要耗费任何时间)
一个数表示答案。
5 2 1 3 2 4
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———货物运输 解题报告