【ybtoj 高效进阶 1.3】B.防具布置【二分】

在这里插入图片描述
在这里插入图片描述

分析

看一眼数据范围
不可能用桶排
若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;
}

猜你喜欢

转载自blog.csdn.net/dglyr/article/details/112384408