代码为本人出于爱好 验题时所写,如有错误,敬请指出。

题面$pdf$为本人排版,不到之处,还请海涵。 

联系方式$QQ$:$774388357$  浙江财经大学 $14$软件工程 周甄陶

相关阅读:记萌新赛的命题过程与踩气球过程

正赛题面:https://pan.baidu.com/s/1jIQASxo

热身赛题面:https://pan.baidu.com/s/1mi4mjMg

热身赛$pdf$密码:IbcS3jJkkOsxiMCYfF6v

弱校现场赛$Rank$:https://pan.baidu.com/s/1kVBFGMV

热身赛$Problem$ $D$:圆覆盖

首先,如果$x$的跨度大于$400000$,一定无解,因为圆半径最多是$100000$。剩下的情况可以枚举计算,枚举横坐标$x$,统计横坐标为$x$的被所有圆覆盖的整点有几个,每个圆覆盖的整点都是一段区间,也就是计算区间交。

#include<bits/stdc++.h>
using namespace std;
 
long long x[110],y[110],r[110];
int n;
long long xmin,xmax,ans;
long long INF=10000000000;
double eps=1e-5;
 
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++) cin>>x[i]>>y[i]>>r[i];
    xmin=x[1]-r[1];
    xmax=x[1]+r[1];
    for(int i=2;i<=n;i++)
    {
        xmin=min(xmin,x[i]-r[i]);
        xmax=max(xmax,x[i]+r[i]);
    }
 
    if(xmax-xmin>400000)
    {
        printf("0\n");
        return 0;
    }
 
    for(long long xx=xmin;xx<=xmax;xx++)
    {
        bool fail=0;
        long long L=-INF,R=INF;
 
        for(int i=1;i<=n;i++)
        {
            if(x[i]-r[i]>xx) fail=1;
            if(x[i]+r[i]<xx) fail=1;
 
            long long p=(long long)sqrt(r[i]*r[i]-(xx-x[i])*(xx-x[i]));
            long long rr=y[i]+p;
            long long ll=y[i]-p;
 
            if(ll>R) fail=1;
            if(rr<L) fail=1;
            if(fail) break;
 
            L=max(L,ll); R=min(R,rr);
        }
        if(fail) continue;
        ans=ans+R-L+1;
    }
 
    cout<<ans;
    return 0;
}
View Code

相关文章: