如果你 WA 在倒数第四个点
查看原帖
如果你 WA 在倒数第四个点
1055410
ThySecret楼主2025/1/21 16:31

二分临界值的代码

bool check(int mid)
{
	__int128 sum = 0;
	for (int i = 1; i <= n; i ++)
	{
		int k = (mid + a[i]) / 2 / a[i];
		sum += (__int128)k * k * a[i];
	}
	return sum <= (__int128)M; 
}

请在循环时判断无解:

bool check(int mid)
{
	__int128 sum = 0;
	for (int i = 1; i <= n; i ++)
	{
		int k = (mid + a[i]) / 2 / a[i];
		sum += (__int128)k * k * a[i];
		if (sum > (__int128)M) return false;
	}
	return sum <= (__int128)M; 
}

这是因为循环中的 kk 可达到 101810^{18},单次循环 sumsum 不会爆掉,但是一共 2e52e5 次加会爆掉。

2025/1/21 16:31
加载中...