HDU-1558-Segment set
来源:互联网 发布:刘意 java 编辑:程序博客网 时间:2024/06/06 06:34
#include<iostream>#include<string>#include<queue>#include<map>#include<set>#include<vector>#include<algorithm>#include<cstdio>#include<cstring>using namespace std;/* 刚开始做的时候,想着遍历这么多次,时间应该不会很快,看来数据很水,62ms给A了; 这是一道线段相交+并查集的问题;题目意思是问你,他查询的编号有多少条线段是跟他有亲戚关系的; 说到亲戚关系很显然就是用并查集了,利用输入的顺序作为编号,将其连通;每输入一次q,就遍历一次 前面的线段,判断是否相交,如果相交就更新连通性;*/int pre[1005];typedef struct{ double x,y;}Point;Point a[1005],b[1005];// 判断直线AB是否与线段CD相交;bool Intersect(Point A,Point B,Point C,Point D){ // 直线方程F(x,y)为:(y-y1)*(x1-x2)-(x-x2)*(y1-y2)=0; double FC=(C.y-A.y)*(A.x-B.x)-(C.x-A.x)*(A.y-B.y); double FD=(D.y-A.y)*(A.x-B.x)-(D.x-A.x)*(A.y-B.y); if(FC*FD<=0) return true; else return false;}int Find(int x){ int r=x; while(pre[r]!=r) r=pre[r]; // 寻找根节点。。。 // 路径压缩; int i=x,j; while(i!=r){ j=pre[i]; pre[i]=r; // 将所有子节点直接指向根节点r; i=j; } return r;}// 将输入的a,b代入,并连通,设fy为父节点。。。;void mix(int a,int b){ int fx=Find(a); int fy=Find(b); if(fx!=fy){ pre[fx]=fy; }}int main(){ int t,n,q,p=0; char ch; scanf("%d",&t); while(t--){ if(p) printf("\n"); // 忘了这个,结果给PE了一次; p=1; int cnt=1; scanf("%d",&n); // 并查集,初始化; for(int i=1;i<=n;i++) pre[i]=i; while(n--){ scanf(" %c",&ch); if(ch=='P'){ scanf("%lf%lf%lf%lf",&a[cnt].x,&a[cnt].y,&b[cnt].x,&b[cnt].y); for(int i=1;i<cnt;i++){ // 如果相交,那么久添加连通量;用下标作为标志符; if(Intersect(a[i],b[i],a[cnt],b[cnt])&&Intersect(a[cnt],b[cnt],a[i],b[i])){ mix(i,cnt); //cout<<'@'<<endl; } } cnt++; }else{ int sum=0; scanf("%d",&q); // 查询,如果根节点与要查询的下标号相同,则就说明连通个数加一; for(int i=1;i<=cnt;i++){ if(Find(q)==Find(i)) sum++; } printf("%d\n",sum); } //for(int i=1;i<cnt;i++) cout<<i<<"-->"<<pre[i]<<endl; } } return 0;}
0 0
- HDU 1558 Segment Set
- hdu 1558 Segment set
- hdu 1558 Segment set
- hdu 1558 Segment set
- HDU 1558 Segment set
- HDU 1558 Segment set
- hdu 1558 Segment set
- HDU-1558-Segment set
- hdu 1558:Segment set
- HDU 1558 Segment set
- HDU 1558 Segment set
- HDU-1558-Segment set
- hdu 1558 Segment set 5.1.4
- hdu 1558 Segment set (并查集)
- HDU 1558 Segment set 并查集
- 并查集 HDU 1558 Segment set
- HDU Segment set
- HDU 1558 Segment set, 计算几何+并查集
- 使用SharedPreferences读写数据
- actionbar tab 字体大小设置
- CocoaPods详解之—-使用篇
- 简单的窗口抖动——Animation
- https原理及tomcat配置https方法
- HDU-1558-Segment set
- 动态链接库DLL
- 水平滑块儿库
- windows pip安装提示ascii code无法解析
- 在javaweb中,当新建一个servlet的时候,运行服务器提示服务器启动失败,解决如下
- 6.c语言中的条件语句
- CocoaPods详解之—-进阶篇
- 问题"trouble processing "一个可能的解决方法
- GCC 命令行详解 -L 指定库的路径 -l 指定需连接的库名