代码为本人出于爱好 验题时所写,如有错误,敬请指出。
题面$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; }