HDU_1558_SegmentSet
来源:互联网 发布:帝国cms企业网站模板 编辑:程序博客网 时间:2024/05/18 04:55
Segment set
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4100 Accepted Submission(s): 1550
Problem Description
A segment and all segments which are connected with it compose a segment set. The size of a segment set is the number of segments in it. The problem is to find the size of some segment set.
Input
In the first line there is an integer t - the number of test case. For each test case in first line there is an integer n (n<=1000) - the number of commands.
There are two different commands described in different format shown below:
P x1 y1 x2 y2 - paint a segment whose coordinates of the two endpoints are (x1,y1),(x2,y2).
Q k - query the size of the segment set which contains the k-th segment.
k is between 1 and the number of segments in the moment. There is no segment in the plane at first, so the first command is always a P-command.
There are two different commands described in different format shown below:
P x1 y1 x2 y2 - paint a segment whose coordinates of the two endpoints are (x1,y1),(x2,y2).
Q k - query the size of the segment set which contains the k-th segment.
k is between 1 and the number of segments in the moment. There is no segment in the plane at first, so the first command is always a P-command.
Output
For each Q-command, output the answer. There is a blank line between test cases.
Sample Input
110P 1.00 1.00 4.00 2.00P 1.00 -2.00 8.00 4.00Q 1P 2.00 3.00 3.00 1.00Q 1Q 3P 1.00 4.00 8.00 2.00Q 2P 3.00 3.00 6.00 -2.00Q 5
Sample Output
12225
Author
LL
Source
HDU 2006-12 Programming Contest
Recommend
LL
线段相交+并查集问题
问题问的是集合中的元素个数
因此合并操作的时候也要合并元素个数
#include <iostream>#include <stdio.h>#include <string.h>using namespace std;const int MN=1005;const double AC=1e-3;char con[2];double se[MN][4]; //输入的直线int senc[MN]; //直线的几何关系int sen[MN]; //集合中的直线个数int find(int n) //查找{ if(senc[n]==n) return n; int t=senc[n]; return senc[n]=find(t);}double dt(double v1,double v2,double v3,double v4) //行列式{ return v1*v4-v2*v3;}bool isx(int i,int j) //判断相交{ double t1=dt(se[i][2]-se[i][0],se[j][0]-se[j][2],se[i][3]-se[i][1],se[j][1]-se[j][3]); if(t1<=AC&&t1>=-AC) return 0; double t2=dt(se[j][0]-se[i][0],se[j][0]-se[j][2],se[j][1]-se[i][1],se[j][1]-se[j][3])/t1; if(t2>1||t2<0) return 0; double t3=dt(se[i][2]-se[i][0],se[j][0]-se[i][0],se[i][3]-se[i][1],se[j][1]-se[i][1])/t1; if(t3>1||t3<0) return 0; return 1;}void mer(int i,int j){ //cout<<i<<" "<<j<<endl; int t1=find(i); int t2=find(j); if(t1==t2) return; sen[t2]=sen[t1]+sen[t2]; //合并元素个数 senc[t1]=t2; //cout<<t2<<" "<<sen[t2]<<endl;}int main(){ int t; int n; int nn; scanf("%d",&t); while(t--) { int p=1; scanf("%d",&n); for(int i=1;i<=n;i++) //重置 { senc[i]=i; sen[i]=1; } for(int i=1;i<=n;i++) { scanf("%s",con); if(con[0]=='Q') { scanf("%d",&nn); printf("%d\n",sen[find(nn)]); } else { scanf("%lf%lf%lf%lf",&se[p][0],&se[p][1],&se[p][2],&se[p][3]); for(int i=1;i<p;i++) { if(isx(i,p)) mer(i,p); } p++; } } if(t) printf("\n"); } return 0;}
0 0
- HDU_1558_SegmentSet
- X的追求道路 SDUT 3027
- iOS中.m中,@interface部分的作用
- 21-IO流-14-IO流(字符流-缓冲区-BufferedReader-readLine方法原理)
- 算法竞赛入门经典: 第三章 数组和字符串 3.3蛇形填数
- hdu 1358 Period(kmp)
- HDU_1558_SegmentSet
- 21-IO流-15-IO流(字符流-缓冲区-复制文本文件)
- 本地推送的使用方法
- hdu 2795(单点修改)
- Unicode
- Codeforces Round #315 (Div. 2) B. Inventory
- 检测CPU利用率的Shell脚本
- hdoj 1863 畅通工程 【最小生成树】
- request.setAttribute()、session.setAttribute()和request.getParameter()的联系与区别