题目
分析
二分答案,那么如果区间不超过该点的答案为单数,说明答案在左边(或自己),否则答案在右边,然后首先要判断是否无解
代码
#include <cstdio>
#include <cctype>
#define rr register
#define min(a,b) ((a)<(b)?(a):(b))
using namespace std;
typedef unsigned uit;
uit n,a[200001],b[200001],z[200001];
inline uit iut(){
rr uit ans=0; rr char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans;
}
inline uit answ(uit t){
rr uit sum=0;
for (rr uit i=1;i<=n;++i)
if (a[i]<=t)
sum+=(min(t,b[i])-a[i])/z[i]+1;
return sum&1;
}
signed main(){
for (rr uit t=iut();t;--t){
n=iut(); rr uit l=0,r=0,ans=0;
for (rr uit i=1;i<=n;++i){
a[i]=iut(),b[i]=iut(),z[i]=iut();
r=r>b[i]?r:b[i];
}
if (!answ(r)) {printf("Poor QIN Teng:( \n"); continue;}
while (l<r){
rr int mid=(l+r)>>1;
if (answ(mid)) r=mid;
else l=mid+1;
}
for (rr uit i=1;i<=n;++i){
if (a[i]>l||b[i]<l) continue;
if ((l-a[i])%z[i]==0) ++ans;
}
printf("%u %u\n",l,ans);
}
return 0;
}