题面

题意:给你一个矩阵,然后有很多的圆,这些圆可能相交着,一个或者几个就导致这个矩形被分割开了,就是从最下面的边到上面的边,连线被这些圆阻隔了,每一堆圆当做一个阻碍,问一共有几个阻碍

题解:看起来好难做啊!~!,我怎么知道一堆圆就把矩阵一横着的局域都占完了

哎然后猛然发现,相交的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);
}
}

最新文章

  1. [UML]UML系列——类图class的实现关系Realization
  2. W3cshool之JavaScript基础
  3. C#绘图双缓冲
  4. Codeforces 622F 「数学数论」「数学规律」
  5. POJ2104 K-th Number 划分树 模板题啊
  6. Git简明手册
  7. 慕课linux学习笔记(九)常用命令(6)
  8. BeyondCompare常用功能图解
  9. BZOJ 1270: [BeijingWc2008]雷涛的小猫( dp )
  10. JAVA二维数组的复制
  11. hadoop cdh5的pig隐式转化(int到betyarray)不行了
  12. maven打包额外的资源文件
  13. PAT基础6-2
  14. SAM文件格式
  15. 开发CMDB系统
  16. BZOJ 193题纪念
  17. matlab中如何将视频保存成图像
  18. 正确理解springboot的常用注入方式
  19. Windows&#160;win7下VMware&#160;Virtual&#160;Ethernet&#160;Adapter未识别网络解决方法
  20. python基础学习1-网络爬虫程序中的代理IP设置

热门文章

  1. OPPO R11 R11plus系列 解锁BootLoader ROOT Xposed 你的手机你做主
  2. Android上UDP组播无法接收数据的问题
  3. android studio高德地图的显示于定位(附带逆地理编码围栏)
  4. YOLO (You Only Look Once)
  5. sphinx在windows下的简单安装与使用
  6. IIS日志分析:SC-Status语义
  7. ubuntu操作系统的目录结构
  8. Scala: Types of a higher kind
  9. scala类型系统:24) 理解 higher-kinded-type
  10. uni-app判断各大平台的语法