因为最多有1个奇数的,对区间进行二分,判断到区间中点的和奇偶性,输出用%I64d。
大视野的原题。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
typedef long long LL;
const int maxn=200005;
LL A[maxn],B[maxn],C[maxn];
int n;
LL cmput(LL r)
{
LL ans=0,tem;
for(int i=1;i<=n;i++)
{
tem=min(r,B[i]);
if(r>=A[i])
ans+=(tem-A[i])/C[i]+1;
}
return ans;
}
int main()
{
freopen("in.txt","r",stdin);
while(scanf("%d",&n)!=EOF)
{
LL l=1<<30,r=1,mid;
for(int i=1;i<=n;i++)
{
scanf("%I64d%I64d%I64d",&A[i],&B[i],&C[i]);
B[i]=A[i]+((B[i]-A[i])/C[i])*C[i];
r=max(r,B[i]);
l=min(l,A[i]);
}
if((cmput(r)&1)==0)
{
printf("DC Qiang is unhappy.\n");
}
else
{
while(l<r)
{
mid=((l+r)>>1);
if(cmput(mid)&1)
{
r=mid;
}
else
l=mid+1;
// cout<<l<<" "<<r<<endl;
}
printf("%I64d %I64d\n",l,cmput(l)-cmput(l-1));
}
}
return 0;
}