【解题报告】 防线
【解题报告】 防线
题目:防线
解题思路:
虽然说是解题报告,但是也是有一部分曲折在其中的,因为这道题开始的时候实在想不到思路,知道看到了某大佬的题解之后才豁然开朗,明白了这道题目的做法,和神奇的思想
这道题的思想很简单,就是用前缀和
你要想,奇数加奇数等于偶数,但是题目中只有一个是奇数的,所以这种情况不成立,那么就只有偶数加奇数或偶数加偶数两种情况
因此我们就做一个前缀和加上一个神奇而又简单的二分,就可以得出正确而又完美有缺的答案了(有缺我也不知道那里缺)
AC代码
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn=200005;
int n,t;
struct ar
{
long long s;
long long e;
long long d;
}a[maxn];
long long judge(long long x)
{
long long ans=0;
for(int i=1;i<=n;i++)
{
if(a[i].s<=x)
ans+=(min(x,a[i].e)-a[i].s)/a[i].d+1;
}
return ans;
}
int main()
{
cin>>t;
while(t--)
{
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i].s>>a[i].e>>a[i].d;
long long l=0,r=((long long)1<<31)-1;
while(l<r)
{
long long mid=(l+r)/2;
if(!(judge(mid)&1))//如果这个min之前的是偶数
l=mid+1;
else
r=mid;
}
int ans=judge(r)-judge(r-1);
if(ans)
cout<<l<<" "<<ans<<endl;
else
cout<<"There's no weakness."<<endl;
}
return 0;
}
本博文为wweiyi原创,若想转载请联系作者,qq:2844938982