hdu4768二分答案

/*
如果发的传单是偶数,那么所有人都收到双数张、
仅考虑发了单数张传单,二分答案x,如果x左边是偶数,那么答案在右侧,如果x左边是奇数,那么答案在左侧  
*/
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define ll long long 
#define maxn 20005
#define INF 1000000009

using namespace std;

struct node{
    ll a,b,c;
}p[maxn]; 
ll n;

long long check(ll x){
    if(x==0) return 0;
    ll res=0,tmp=0;
    for(int i=1;i<=n;i++){
        tmp=min(x,p[i].b);//因为这个地方没写wa了
        res+=tmp>=p[i].a?(tmp-p[i].a)/p[i].c+1:0;//一定要判定一下 
    }
    return res;
} 

int main(){
    while(scanf("%lld",&n)==1){
        ll sum=0,l=1,r=1,ans,mid;
        for(int i=1;i<=n;i++){
            scanf("%lld%lld%lld",&p[i].a,&p[i].b,&p[i].c);
            r=max(r,p[i].b);
            sum+=p[i].a<=p[i].b?(p[i].b-p[i].a)/p[i].c+1:0;
        }
        if(sum%2==0){
            puts("DC Qiang is unhappy.");
            continue;
        }
        while(l<=r){
            mid=l+r>>1;
            if(check(mid)%2!=0)//mid及左边的传单数是奇数,那个人在左边 
                ans=mid,r=mid-1;
            else l=mid+1;    //那个人在右边      
        }
        printf("%lld %lld\n",ans,check(ans)-check(ans-1));
    }    
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/zsben991126/p/10143895.html