hdu4768二分答案

Posted zsben991126

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
",ans,check(ans)-check(ans-1));
    }    
    return 0;
}

 

以上是关于hdu4768二分答案的主要内容,如果未能解决你的问题,请参考以下文章

hdu 4768 异或运算

POJ4768(二分区间)

codevs 4768 跳石头

hdu4190 二分答案

2019杭电多校第四场hdu6621 K-th Closest Distance(二分答案+主席树)

hdu5044(二分)