/**
二分。
左边界是1右边界是1LL>>31
每次计算mid左边的传单数,如果为奇数,由于传单数为奇数的人只有一个,所以可以确定这个人在mid的右边,否则在左边。
不断二分将区间缩小为1
**/
#include<stdio.h>
#define LL __int64
#define N 20009
int n;
struct node
{
LL a,b,c;
}d[N];
LL cal(LL temp)
{
LL sum=0,up;
int i;
for(i=0;i<n;i++)
{
up=temp;
up=up<d[i].b?up:d[i].b;
// printf("%I64d ***\n",up);
if(up>=d[i].a)
sum+=(up-d[i].a)/d[i].c+1;
//printf(" %d %d sum\n",up,sum);
}
return sum;
}
int main()
{
int i;
while(scanf("%d",&n)!=EOF)
{
for(i=0;i<n;i++)
scanf("%I64d%I64d%I64d",&d[i].a,&d[i].b,&d[i].c);
LL l=1,r=1LL<<31;
while(l<r)
{
LL mid=(l+r)/2;
// printf("%I64d*\n",mid);
if(cal(mid)%2)
r=mid;
else
l=mid+1;
}
if(l==1LL<<31)
printf("DC Qiang is unhappy.\n");
else
printf("%I64d %I64d\n",l,(cal(l)-cal(l-1)));
}
return 0;
}
hdu4768Flyer二分
最新推荐文章于 2020-07-09 20:10:19 发布