/*
如果发的传单是偶数,那么所有人都收到双数张、
仅考虑发了单数张传单,二分答案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;
}
转载于:https://www.cnblogs.com/zsben991126/p/10143895.html