hdu4768二分答案

时间:2021-04-19 19:58:18
/*
如果发的传单是偶数,那么所有人都收到双数张、
仅考虑发了单数张传单,二分答案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==) return ;
ll res=,tmp=;
for(int i=;i<=n;i++){
tmp=min(x,p[i].b);//因为这个地方没写wa了
res+=tmp>=p[i].a?(tmp-p[i].a)/p[i].c+:;//一定要判定一下
}
return res;
} int main(){
while(scanf("%lld",&n)==){
ll sum=,l=,r=,ans,mid;
for(int i=;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+:;
}
if(sum%==){
puts("DC Qiang is unhappy.");
continue;
}
while(l<=r){
mid=l+r>>;
if(check(mid)%!=)//mid及左边的传单数是奇数,那个人在左边
ans=mid,r=mid-;
else l=mid+; //那个人在右边
}
printf("%lld %lld\n",ans,check(ans)-check(ans-));
}
return ;
}