标签:答案 fine out tin iostream 代码 turn include 建立
公元2222年,l国发生了一场战争。
5 2 1 3 2 4Sample Output
1
题解:
这个题目是不是和noip2015day2T3很像,于是我就打了一个差分+二分,wa了,怎么回事呢?因为他们不一定是区间的交,还有可能隧道不在区间的交中。
所以这个题目就特别难想了,当然如果我们还是二分一个答案mid很轻易的就可以列出不等式abs(stari-x)+abs(endi-y)<=mid,stari为i号点的起点,endi为终点,x为隧道起点,y为隧道终点,那么显然对于满足所以1~i合法的(x,y)整数点对的坐标就是这个题目的答案。
当然我们不需要用计算几何的知识,我们只需要讲这个不等式拆开,判短不等式是否成立就可以了。
这个题目还是比较神的,可以多思考一下,不要先看题解。
代码:
#include <cstdio> #include <iostream> #include <algorithm> #include <cstring> #include <cmath> #include <iostream> #define MAXN 500100 #define inf 1<<30 using namespace std; int n,m; int l[MAXN],r[MAXN]; bool check(int mid){ int d1=-inf,d2=1<<30,c1=-inf,c2=1<<30; for(int i=1;i<=n;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) return 0; if(c1>c2) return 0; } return 1; } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) scanf("%d%d",&l[i],&r[i]); for(int i=1;i<=m;i++){ if(l[i]>r[i]) swap(l[i],r[i]); } int l=0,r=n,mid,ans=-1; while(l<=r){ mid=(l+r)/2; if(check(mid)) ans=mid,r=mid-1; else l=mid+1; } printf("%d\n",ans); return 0; }
标签:答案 fine out tin iostream 代码 turn include 建立
原文地址:http://www.cnblogs.com/renjianshige/p/7524388.html