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二分答案的主要内容,如果未能解决你的问题,请参考以下文章