Gym-101915J The Volcano Eruption 计算几何
2024-08-24 07:01:25
题意:给你一个矩阵,然后有很多的圆,这些圆可能相交着,一个或者几个就导致这个矩形被分割开了,就是从最下面的边到上面的边,连线被这些圆阻隔了,每一堆圆当做一个阻碍,问一共有几个阻碍
题解:看起来好难做啊!~!,我怎么知道一堆圆就把矩阵一横着的局域都占完了
哎然后猛然发现,相交的2个圆,是不是可以连边,
然后从对于每个联通的子图,是不是最左边的圆上有点超过了矩形最左边,同时右边也是,就隔开了!
所以建图(实际这个图也不用建出来),dfs一下就行了
注意一下精度的问题,所有比大小相关的最后都带eps
#include<bits/stdc++.h>
using namespace std;
#define N 1005
#define eps 1e-6
double w,l,x[N],y[N],r[N],ll,rr;
int cnt,T,n,vis[N],ok=;
double sqr(double x){return x*x;}
int check(int a,int b)
{
return ( (sqr(x[a]-x[b])+sqr(y[a]-y[b]))<sqr(r[a]+r[b]+eps) );
}
void dfs(int u)
{
if (vis[u]) return ;
vis[u]=;
if (x[u]+r[u]>=w) ok=;
for (int v=;v<n;v++)
{
if (v==u) continue;
if (!vis[v] && check(u,v)) dfs(v);
}
return ;
}
int main()
{
scanf("%d",&T);
while (T--)
{
scanf("%d%lf%lf",&n,&w,&l);
cnt=;
memset(vis,,sizeof(vis));
for (int i=;i<=n;i++) scanf("%lf%lf%lf",&x[i],&y[i],&r[i]);
for (int i=;i<=n;i++)
if (x[i]-r[i]<=eps)
{
ok=;
if (!vis[i]) dfs(i);
if (ok==) cnt++; }
printf("%d\n",cnt);
}
}
最新文章
- [UML]UML系列——类图class的实现关系Realization
- W3cshool之JavaScript基础
- C#绘图双缓冲
- Codeforces 622F 「数学数论」「数学规律」
- POJ2104 K-th Number 划分树 模板题啊
- Git简明手册
- 慕课linux学习笔记(九)常用命令(6)
- BeyondCompare常用功能图解
- BZOJ 1270: [BeijingWc2008]雷涛的小猫( dp )
- JAVA二维数组的复制
- hadoop cdh5的pig隐式转化(int到betyarray)不行了
- maven打包额外的资源文件
- PAT基础6-2
- SAM文件格式
- 开发CMDB系统
- BZOJ 193题纪念
- matlab中如何将视频保存成图像
- 正确理解springboot的常用注入方式
- Windows&#160;win7下VMware&#160;Virtual&#160;Ethernet&#160;Adapter未识别网络解决方法
- python基础学习1-网络爬虫程序中的代理IP设置
热门文章
- OPPO R11 R11plus系列 解锁BootLoader ROOT Xposed 你的手机你做主
- Android上UDP组播无法接收数据的问题
- android studio高德地图的显示于定位(附带逆地理编码围栏)
- YOLO (You Only Look Once)
- sphinx在windows下的简单安装与使用
- IIS日志分析:SC-Status语义
- ubuntu操作系统的目录结构
- Scala: Types of a higher kind
- scala类型系统:24) 理解 higher-kinded-type
- uni-app判断各大平台的语法