Matrix POJ - 3685 二分

#include<queue>
#include<cmath>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define pi acos(-1.0)
#define ll long long int
using namespace std;
const int M=(int)1e5;
const ll mod=(ll)1e9 + 7;
const ll inf=0x3f3f3f3f3f;
ll n,m;
ll f(ll i,ll j)
{
	return i*i+j*j+M*(i-j)+i*j;
}
bool check(ll x)
{
	ll cnt=0;
	for(int i=1; i<=n; ++i)
	{
		int l=0;
		int r=n;
		while(l<r)
		{
			int mid=(l+r+1)>>1;
			if(f(mid,i)>x)
				r=mid-1;
			else
				l=mid;
		}
		cnt+=l;
	}
	return cnt>=m;
}
int main()
{
	int T;
	cin>>T;
	while(T--)
	{
		cin>>n>>m;
		ll l=-inf;
		ll r=inf;
		while(l<r)
		{
			ll mid=(l+r)>>1;
			if(check(mid))
				r=mid;
			else
				l=mid+1;
		}
		printf("%lld\n",l);
	}
	return 0;
}
posted @ 2020-05-07 00:36  晴屿  阅读(95)  评论(0编辑  收藏  举报