def check(mid):
ans=0
for s,e,d in maps:
if mid>=s:
ans+=(min(mid,e)-s)//d+1
return ans
T=int(input())
for _ in range(T):
maps=[]
N=int(input())
l=float(‘inf’)
r=float(‘-inf’)
for i in range(N):
s,e,d=map(int,input().split())
l=min(s,l)
r=max(e,r)
maps.append([s,e,d])
maxs=r
while l<=r:
mid=l+r>>1
if check(mid)&1:
r=mid-1
else:
l=mid+1
if l>maxs:
print(“There’s no weakness.”)
else:
print(l,check(l)-check(l-1))
这个题目我刚开始做的时候一点思绪没有,但是因为是二分的题目,我在考虑如果往二分的思想上取靠拢,但是吧,没有左右区间啊,怎么找左右区间呢,这时候奇偶和就是一个很好的思路,大多数题目都是根据奇偶和来判断区间范围的,所以只要这个区间和是偶数,那么一定没有奇数(题目说了,只有一个奇数),所以通过判断奇数在哪我没来缩减区间,所以关键就是去求解区间和,这个不就是前缀和吗,对于最后的我们要求的值也是通过前缀和相减来求解,所以得到了正解
但是我还是出错啦,出错在前缀和的地方,因为我没与考虑范围,有可能会小于我没最开始的那个s,所以我们还要考虑这个范围,还要注意不能大于那个e