题意:
首先,数据不保证总人数不大于10^8,所以要开long long(mdzz,被坑了好几个wa)
题目保证最多有且只有一个位置是奇数,所以很显然会想到奇数+偶数=奇数
对于x处的人数维护一个前缀和
那么我们就二分这个奇数的位置,从这个位置往后(包括这个位置)的前缀和都是奇数,这个位置之前(不包含这个位置)的前缀和都是偶数
每个小组贡献的人数为 min(x-s[i],e[i]-s[i]) / d[i] +1
var
n,t :longint;
i :longint;
l,r,mid,ans :int64;
s,e,d :array[0..200010] of longint;
function min(a,b:longint):longint;
begin
if a<b then exit(a) else exit(b);
end;
function get_sum(x:int64):int64;
var
tt:int64;
begin
tt:=0;
for i:=1 to n do
if s[i]<=x then inc(tt,min(x-s[i],e[i]-s[i]) div d[i]+1);
exit(tt);
end;
function check(x:int64):boolean;
var
tt:int64;
begin
tt:=get_sum(x);
if tt and 1=1 then exit(true) else exit(false);
end;
begin
read(t);
while (t>0) do
begin
dec(t);
read(n);
for i:=1 to n do read(s[i],e[i],d[i]);
l:=0; r:=maxlongint; ans:=0;
while (l<=r) do
begin
mid:=(l+r)>>1;
if check(mid) then
begin
ans:=mid; r:=mid-1;
end else l:=mid+1;
end;
if ans=0 then writeln('Poor QIN Teng:(')
else writeln(ans,' ',get_sum(ans)-get_sum(ans-1));
end;
end.
——by Eilys