zufe 2432 圆覆盖

编程入门 行业动态 更新时间:2024-10-20 03:41:16

<a href=https://www.elefans.com/category/jswz/34/1720363.html style=zufe 2432 圆覆盖"/>

zufe 2432 圆覆盖

问题 K: 圆覆盖

时间限制: 1 Sec   内存限制: 256 MB
提交: 64   解决: 12
[ 提交][ 状态][ 讨论版]

题目描述

题解:
找一个圆,枚举圆中的纵坐标,对于每个圆循环一次求区间的并。
代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll x[102],y[102],r[102];
ll abs1(ll k)
{if(k<0)return -k;return k;
}
int main()
{int n;scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%lld%lld%lld",&x[i],&y[i],&r[i]);ll ans=0;for(ll i=y[1]+r[1];i>=y[1]-r[1];i--){ll l2=1.00*x[1]-sqrt(1.00*r[1]*r[1]-1.00*(i-y[1])*(i-y[1]));ll r2=1.00*x[1]+sqrt(1.00*r[1]*r[1]-1.00*(i-y[1])*(i-y[1]));l2-=1;r2+=1;while(r[1]*r[1]-(i-y[1])*(i-y[1])<(l2-x[1])*(l2-x[1]))l2++;//控制精度。while(r[1]*r[1]-(i-y[1])*(i-y[1])<(r2-x[1])*(r2-x[1]))r2--;bool bb=1;for(int j=2;j<=n;j++){if(i>y[j]+r[j]||i<y[j]-r[j]){bb=0;break;}ll k=abs1(i-y[j]);ll l1=1.00*x[j]-sqrt(1.00*r[j]*r[j]-1.00*k*k);ll r1=1.00*x[j]+sqrt(1.00*r[j]*r[j]-1.00*k*k);l1-=1;r1+=1;while(r[j]*r[j]-(i-y[j])*(i-y[j])<(l1-x[j])*(l1-x[j]))l1++;while(r[j]*r[j]-(i-y[j])*(i-y[j])<(r1-x[j])*(r1-x[j]))r1--;if(r1<l2||l1>r2){bb=0;break;}l2=max(l2,l1);r2=min(r2,r1);}if(bb&&r2>=l2) ans+=r2-l2+1;}printf("%lld\n",ans);return 0;
}

更多推荐

zufe 2432 圆覆盖

本文发布于:2024-03-08 08:32:03,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1720352.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:zufe

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!