您的位置:首页 > 其它

成都预赛 Polar intersecting line segments 已知N个线段,判断是否相交 排序+划分区间

2010-09-15 21:04 489 查看

Polar intersecting line segments

Time Limit: 1000 MS Memory Limit: 65536 K

Description

In this problem, you are asked to determine if a set of line segments intersect.

Input

The first line of input is a number c ≤ 20, the number of test cases. The first line of each test case is a number k ≤ 50000, the number of line segments. The following k lines each consist of two numbers to eight decimal places θ1, θ2 with 0 < θ1 < 2π and 0 < θ2 < 2π describing the line segment from (cos θ1, sin θ1) to (cos θ2, sin θ2). For each test case, all inputs points are distinct.

Output

For each test case, you should output a single line containing “intersect” if any two of the k lines intersect and “do not intersect” otherwise. The endpoints of a line are considered to be part of the line.

Sample Input

2
2
0 3.14159265
1.57079633 4.71238898
2
0 1.57079633
3.14159265 4.71238898

Sample Output

intersect
do not intersect

Source

Northeast North-America 2009, practice contest

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const double eps=1e-8;
struct Point
{
double x,y;//角度
};
Point a[50000+10];
int flag;
bool cmp(Point h,Point k)
{
if(h.x!=k.x) return h.x<k.x;
return h.y<k.y;
}
void check(int l,int r)
{
if(l>=r) return ;
if(flag==0) return ;
for(int i=l;i<=r;)
{
int j=i+1;
while(j<=r&&a[i].x<a[j].x&&a[j].y<a[i].y) j++;
check(i+1,j-1);
if(flag==0) return ;
if(j==r+1) return ;
if(a[i].y<a[j].x) i=j;
else
{
flag=0;
return ;
}
}
}
int main()
{
int ci;scanf("%d",&ci);
while(ci--)
{
int n;scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%lf%lf",&a[i].x,&a[i].y);
if(a[i].x>a[i].y) swap(a[i].x,a[i].y);
}
sort(a,a+n,cmp);
flag=1;
check(0,n-1);
if(flag) printf("do not intersect/n");
else printf("intersect/n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: