[二分+曼哈顿距离] 51Nod1671 货物运输
2017-10-23 07:55
246 查看
就是先二分答案,然后考虑如何验证。
满足 bi−ai≤mid 的点就不用管了,设传送点建在X,Y, 则剩下的点需要满足:
|X−ai|+|Y−bi|≤mid
这是如果我们发现考虑枚举一个端点什么的,很难搞。可以转化一下,注意上面的约束是一个曼哈顿距离的形式,也就是说把 (X,Y),(ai,aj) 看成点,然后只需要求一些全等的正方形是否有交就行了。
满足 bi−ai≤mid 的点就不用管了,设传送点建在X,Y, 则剩下的点需要满足:
|X−ai|+|Y−bi|≤mid
这是如果我们发现考虑枚举一个端点什么的,很难搞。可以转化一下,注意上面的约束是一个曼哈顿距离的形式,也就是说把 (X,Y),(ai,aj) 看成点,然后只需要求一些全等的正方形是否有交就行了。
#include<cstdio> #include<cstring> #include<algorithm> #define Fir first #define Sec second #define mp(x,y) make_pair(x,y) using namespace std; const int maxn=500005; int n,m,mid,ans; pair<int,int> a[maxn]; bool check(){ int t1=1e9,t2=-1e9,t3=1e9,t4=-1e9; for(int i=1;i<=m;i++) if(a[i].Sec-a[i].Fir>mid){ t1=min(t1,a[i].Fir+a[i].Sec+mid); t2=max(t2,a[i].Fir+a[i].Sec-mid); t3=min(t3,a[i].Sec-a[i].Fir+mid); t4=max(t3,a[i].Sec-a[i].Fir-mid); } return t2<=t1&&t4<=t3; } int main(){ freopen("51nod1671.in","r",stdin); freopen("51nod1671.out","w",stdout); scanf("%d%d",&n,&m); for(int i=1;i<=m;i++){ scanf("%d%d",&a[i].Fir,&a[i].Sec); if(a[i].Fir>a[i].Sec) swap(a[i].Fir,a[i].Sec); if(a[i].Fir==a[i].Sec) i--,m--; } if(!m) return printf("0"),0; int L=1,R=1000000; while(L<=R){ mid=(L+R)>>1; if(check()) R=mid-1, ans=mid; else L=mid+1; } printf("%d\n",ans); return 0; }
相关文章推荐
- 【二分+曼哈顿距离】51Nod 1671 货物运输
- .Java多分支;if……else…… 每吨货物每公里运费P与运输距离S有关,路途越远,每公里运价越低。两种解决方案
- [51nod1671]货物运输
- HDU 5699 货物运输 二分
- 51nod1671【货物运输】
- HDU 5699 货物运输 ( 二分 + 不等式判断 )
- HDU 4543|三足鼎立|曼哈顿距离|二分答案
- HDU 5699 货物运输 (二分 + 不等式判断 好题)
- 【IndiaHacks 2016 - Online Edition (Div 1 + Div 2) ErrichtoD】【二分答案 最大流】Delivery Bears x只熊运输同样的实物重量货物
- 输入货物的重量和运输的距离,自动计算出总运费
- hdu5699 货物运输(二分)
- HDU 5699 货物运输 二分判定
- [poj 2926]Requirements[最远曼哈顿距离]
- [BZOJ4326][NOIP2015]运输计划(二分答案+树上差分)
- codeforces 100959B Airports 曼哈顿距离最大生成树
- poj 2926 Requirements N维最远曼哈顿距离
- CCF NOI1062 计算曼哈顿距离
- <考试题> codevs 5440 运输计划 (二分+lca+dfs序+树上差分)
- bzoj 4326 运输计划 (树链剖分 + 树上差分 + 二分)
- hdu 4666:Hyperspace(最远曼哈顿距离 + STL使用)