博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【清北前紧急补课5】辣鸡奶酪
阅读量:5303 次
发布时间:2019-06-14

本文共 1567 字,大约阅读时间需要 5 分钟。

noip2017的并查集辣鸡题。

挺好想但是我把ans1和ans2放在循环外边了。修修改改很久也没改对心态很爆炸

不过后来在同学的帮助下改对了。

不过心态还是很爆炸。

 

#include
#include
#include
#include
#include
#define ll long longusing namespace std;long long t,n,h,r,x[100010],y[100010],z[100010];int f[1010];int f1[100001],f2[100001];//分别记录与上表面相交/切的点和下表面相交/切的点double dis(ll x1,ll y1,ll z1,ll x2,ll y2,ll z2){ return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)+(z1-z2)*(z1-z2));}//距离公式int find(int x){ return x==f[x]?x:f[x]=find(f[x]);}//并查集找祖宗int main(){ cin>>t; for(int i=1;i<=t;i++){ cin>>n>>h>>r; int ans1=0,ans2=0; for(int j=1;j<=n;j++) f[j]=j; for(int j=1;j<=n;j++){ cin>>x[j]>>y[j]>>z[j]; if(z[j]+r>=h){ ans1++; f1[ans1]=j;//上表面相交/切的点被标记 } if(z[j]-r<=0){ ans2++; f2[ans2]=j;//下表面相交/切的点被标记 } for(int k=1;k<=j;k++){ if(dis(x[j],y[j],z[j],x[k],y[k],z[k])<=2*r){ int q1=find(j); int q2=find(k); if(q1!=q2) f[q1]=q2;//将两个相连的点的祖宗相连 } } } int right=0; for(int j=1;j<=ans1;j++){ for(int k=1;k<=ans2;k++){ if(find(f1[j])==find(f2[k])){ right=1;break; } }//看看所有相连的点是否能与上下表面相通 if(right==1) break; } if(right==1) cout<<"Yes"<

 

转载于:https://www.cnblogs.com/civilization-ga/p/9342474.html

你可能感兴趣的文章
MPU6050
查看>>
Asp.Net 加载不同项目程序集
查看>>
Jenkins插件--通知Notification
查看>>
思1-基本三观
查看>>
angularJS--apply() 和digest()方法
查看>>
Alpha 冲刺 (5/10)
查看>>
PHP函数之$_SERVER
查看>>
利用安装光盘创建本地yum源补装 RPM 软件包-通过命令行模式
查看>>
XML通過XSD產生CLASS
查看>>
跨线程调用窗体控件
查看>>
linq to sql 扩展方法
查看>>
241. Different Ways to Add Parentheses
查看>>
实验10 编写子程序 1.显示字符串
查看>>
Effect-Compiler Tool(fxc.exe)
查看>>
django中的缓存 单页面缓存,局部缓存,全站缓存 跨域问题的解决
查看>>
常见HTTP状态码(200、301、302、500等)
查看>>
解决随机数生成的坐标在对角线上的问题
查看>>
ps aux 状态介绍
查看>>
二级指针内存模型
查看>>
bzoj千题计划140:bzoj4519: [Cqoi2016]不同的最小割
查看>>