hdu4768Flyer二分

/**
 二分。
 左边界是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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值