分析
看一眼数据范围
不可能用桶排
若pd(231-1)为偶数,则整道防线没有破绽
因为只有一个破绽
二分破绽的位置
如果这个位置的防具总数是奇数
说明破绽在前面
否则在后
上代码
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
ll s[200001],e[200001],d[200001];
ll t,n,m,a[100001],l,r,mid;
ll pd(ll x)
{
ll sum=0;
for(int i=1;i<=n;i++)
{
if(s[i]<=x)
{
sum+=(min(x,e[i])-s[i])/d[i]+1;
}
}
return sum;
}
int main()
{
cin>>t;
while(t--)
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d%d%d",&s[i],&e[i],&d[i]);
}
l=0,r=2147483647;
if(pd(r)%2==0)
{
cout<<"There's no weakness."<<endl;
continue;
}
while(l<r)
{
mid=(l+r)>>1;
if(pd(mid)&1) r=mid;
else l=mid+1;
}
cout<<l<<' '<<pd(l)-pd(l-1)<<endl;;
}
return 0;
}