ABC389D

考场上读成数所有正方形的个数了,过了好久才发现是简单题。

考虑除了圆心所在行和列以外的格子分布状况。由圆的对称性可知,只需求出 \(\frac{1}{4}\) 个圆的格子个数即可。不难发现当横坐标确定时,最大的纵坐标也是确定的。于是可以直接枚举横坐标,并二分确定最大的纵坐标,即可获得该行的格子数量。将每行的结果累加并乘 \(4\),再算上与圆心同行或同列的格子即为答案。

时间复杂度 \(O(R\log R)\),具体细节见代码。

#include <iostream>
#include <cstdio>
#define int long long

using namespace std;

double R;
int l,r,mid,ans,p;

double dis( double x1 , double y1 , double x2 , double y2 )
{
	return ( x1 - x2 ) * ( x1 - x2 ) + ( y1 - y2 ) * ( y1 - y2 );
}

signed main()
{
	cin >> R;
	for( int i = 1 ; i <= R ; i ++ )
	{
		l = 1,r = R,p = -1;
		while( l <= r )
		{
			mid = ( l + r ) / 2;
			if( dis( i + 1 , mid + 1 , 0.5 , 0.5 ) > R * R ) r = mid - 1;
			else l = mid + 1,p = mid;//cout << dis( double( i + 0.5 ) , double( mid + 0.5 ) , 0.5 , 0.5 ) << '\n';
		}
		if( p == -1 )
			continue;
		ans += p * 4;
	}
	ans += ( R - 1 ) * 4 + 1;
	cout << ans;
	return 0;
}
posted @ 2025-09-08 18:39  FormulaOne  阅读(6)  评论(0)    收藏  举报