解析:
1.根據題目所述,最多隻有一個位置數量是奇數,那麼說明所有位置上的數量之和也一定是奇數。
因爲奇數+偶數=奇數
2.我們通過二分來確定位置。如果[l,mid]的數量總和是奇數那麼就縮小範圍,反之[mid+1,r]這部分肯定是偶數了。
3.數量總和可以用前綴和表示sum[x]:表示第x個位置之前所有位置上數量之和。
那麼可以O(n)求解出總和。
假設s<=x 那麼它們之間防具的數量=(min(e,x)-s)/d+1;
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+10000;
int t,n;
struct node
{
int s,e,d;
}a[N];
ll check(int x)
{
ll res=0;
for(int i=1;i<=n;i++)
{
if(a[i].s<=x) res+=(min(a[i].e,x)-a[i].s)/a[i].d+1;
}
return res;
}
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
int l=0,r=0;
for(int i=1;i<=n;i++)
{
cin>>a[i].s>>a[i].e>>a[i].d;
r=max(r,a[i].e);
}
int ans;
while(l<=r)
{
int mid=l+r>>1;
if(check(mid)&1) r=mid-1,ans=mid;
else l=mid+1;
}
ll res=check(ans)-check(ans-1);
if(res&1) cout<<ans<<" "<<res<<endl;
else cout<<"There's no weakness."<<endl;
}
}