【解题报告】 防线

【解题报告】 防线

题目:防线

解题思路:

虽然说是解题报告,但是也是有一部分曲折在其中的,因为这道题开始的时候实在想不到思路,知道看到了某大佬的题解之后才豁然开朗,明白了这道题目的做法,和神奇的思想

这道题的思想很简单,就是用前缀和

你要想,奇数加奇数等于偶数,但是题目中只有一个是奇数的,所以这种情况不成立,那么就只有偶数加奇数或偶数加偶数两种情况

因此我们就做一个前缀和加上一个神奇而又简单的二分,就可以得出正确而又完美有缺的答案了(有缺我也不知道那里缺)

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;
}
posted @ 2019-08-23 23:53  wweiyi  阅读(120)  评论(0编辑  收藏  举报
js脚本