线段判交+并查集:
#include<iostream>
//#define min(x,y) (x < y ? x : y)
//#define max(x,y) (x > y ? x : y)
using namespace std;
int fa[10000];
int ff(int y)
{
int t=fa[y];
while(t!=fa[t])
{
t=fa[t];
}
return t;
}
struct point{
double x;
double y;
};
struct xianduan{
point a;
point b;
}c[1000];
double max(double x,double y)
{
if(x>=y) return x;
else return y;
}
double min(double x,double y)
{
if(x<=y) return x;
else return y;
}/*
int ff(int x)
{
int t=fa[x];
if(t!=fa[t])
{
t=fa[t];
}
return t;
}
*/double multiply(point p1,point p2,point p0)
{
return((p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y));
}
int intersect(xianduan u,xianduan v)
{
return( (max(u.a.x,u.b.x)>=min(v.a.x,v.b.x))&&
(max(v.a.x,v.b.x)>=min(u.a.x,u.b.x))&&
(max(u.a.y,u.b.y)>=min(v.a.y,v.b.y))&&
(max(v.a.y,v.b.y)>=min(u.a.y,u.b.y))&&
(multiply(v.a,u.b,u.a)*multiply(u.b,v.b,u.a)>=0)&&
(multiply(u.a,v.b,v.a)*multiply(v.b,u.b,v.a)>=0));
}
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
int i=0;
for(int pp=0;pp<n;pp++)
fa[pp]=pp;
for(int k=1;k<=n;k++)
{
int sum=0;
char z;
cin>>z;
switch(z)
{
case 'P':
cin>>c[i].a.x>>c[i].a.y>>c[i].b.x>>c[i].b.y;
for(int j=0;j<i;j++)
{
if(intersect(c[i],c[j]))
{
int xx=ff(i);
int yy=ff(j);
if(xx!=yy)
{
fa[xx]=yy;
}
}
}
i++;
break;
case 'Q':
int th;
cin>>th;
int zz=ff(th-1);
for(int j=0;j<i;j++)
{
if(ff(j)==zz)
sum++;
}
cout<<sum<<endl;
break;
}
}
if(t!=0)
cout<<endl;
}
}
hdu 1558 Segment set
最新推荐文章于 2020-06-07 09:00:00 发布
