Codeforces Round #230 (Div. 2) C. Blocked Points ACM解题报告(暴力)

来源:互联网 发布:飞龙淘宝小号浮云网 编辑:程序博客网 时间:2024/05/21 21:43

我还是too young 啊,这题没我想的那么简单,这题是在半径为n的圆内部及圆上的整数点称为特殊点,圆外的称为非特殊点,然后要求每个特殊点都不与非特殊点4-connected(有定义)。

这题的想法就是圆内最外一层的点都选出来阻断,就可以了。于是只要计算一个象限,*4就是平面内的answer,即可枚举横坐标1-n。

然后开根算出纵坐标,取圆内的整数点,此时需要记录前一个纵坐标,如果两个纵坐标相等,只需要取走当前算出来的横纵坐标这个点,如果两个纵坐标不想等,为了防止前一个纵坐标下的点不与外界connect,则需要取走y前-y当个点。(可以画图自己看一下,形状是取走当前算出的点,和边上横坐标-1后,纵坐标从当前+1的位置到前一个纵坐标的那些点,这样才可以把内部都围住)。注意n=0的情况

#include<iostream>#include<cstdio>#include<cctype>#include<cstdlib>#include<cmath>#include<algorithm>#include<cstring>#include<string>#include<vector>#include<queue>#include<map>#include<set>#include<sstream>#include<stack>using namespace std;#define MAX 105typedef long long LL;const double pi=3.141592653589793;const int INF=1e9;const double inf=1e20;int main(){    LL n,sum=0,ans=0;    scanf("%I64d",&n);    double R=n;    LL tmp=n;    for(LL i=1;i<=n;i++)    {        double r=i;        LL k=(LL)sqrt(R*R-r*r);        ans+=(tmp==k?1:tmp-k);        tmp=k;    }    if(n==0) printf("1\n");    else printf("%I64d\n",ans*4);    return 0;}



0 0