2 1 10 1 2 10 1 4 5 20 7 6 14 3 5 9 1 7 21 12
1 1 8 1
二分查找,且要用64位整型,先统计标签数目,为偶数则必然不存在任何一个人为奇数的情况。
然后,在用二分查找。
#include"stdio.h"
#include"string.h"
#include"iostream"
using namespace std;
#define N 20005
#define inf 0x7fffffff
#define LL __int64
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
LL a[N],b[N],d[N];
int main()
{
int i,n;
while(~scanf("%d",&n))
{
LL sum,l,r,t;
sum=r=0; l=inf;
for(i=0;i<n;i++)
{
scanf("%I64d%I64d%I64d",&a[i],&b[i],&d[i]);
t=(b[i]-a[i])/d[i];
sum+=t+1;
r=max(r,a[i]+t*d[i]);
l=min(l,a[i]);
}
if(sum%2==0)
printf("DC Qiang is unhappy.\n");
else
{
LL mid,num,y;
while(l<=r)
{
mid=(l+r)/2;
num=0;
sum=0;
for(i=0;i<n;i++)
{
if(a[i]>mid)
continue;
if(mid<=b[i])
t=(mid-a[i])/d[i];
else if(mid>b[i])
t=(b[i]-a[i])/d[i];
sum+=t+1;
if(a[i]+t*d[i]==mid||mid==a[i]) //统计边界点mid的数目
num++;
y=mid;
}
if(num%2) break; //该点就是奇数点
if(sum%2) r=mid-1;
else l=mid+1;
}
printf("%I64d %I64d\n",y,num);
}
}
return 0;
}
hdu 4768 Flyer(二分查找),布布扣,bubuko.com
原文:http://blog.csdn.net/u011721440/article/details/38455079