poj 2653 线段与线段相交
2016-05-19 21:59
453 查看
Pick-up sticks
Description
Stan has n sticks of various length. He throws them one at a time on the floor in a random way. After finishing throwing, Stan tries to find the top sticks, that is these sticks such that there is no stick on top of them. Stan has noticed that the last thrown stick is always on top but he wants to know all the sticks that are on top. Stan sticks are very, very thin such that their thickness can be neglected.
Input
Input consists of a number of cases. The data for each case start with 1 <= n <= 100000, the number of sticks for this case. The following n lines contain four numbers each, these numbers are the planar coordinates of the endpoints of one stick. The sticks are listed in the order in which Stan has thrown them. You may assume that there are no more than 1000 top sticks. The input is ended by the case with n=0. This case should not be processed.
Output
For each input case, print one line of output listing the top sticks in the format given in the sample. The top sticks should be listed in order in which they were thrown.
The picture to the right below illustrates the first case from input.
![](http://poj.org/images/2653_1.jpg)
Sample Input
Sample Output
Time Limit: 3000MS | Memory Limit: 65536K | |
Total Submissions: 11884 | Accepted: 4499 |
Stan has n sticks of various length. He throws them one at a time on the floor in a random way. After finishing throwing, Stan tries to find the top sticks, that is these sticks such that there is no stick on top of them. Stan has noticed that the last thrown stick is always on top but he wants to know all the sticks that are on top. Stan sticks are very, very thin such that their thickness can be neglected.
Input
Input consists of a number of cases. The data for each case start with 1 <= n <= 100000, the number of sticks for this case. The following n lines contain four numbers each, these numbers are the planar coordinates of the endpoints of one stick. The sticks are listed in the order in which Stan has thrown them. You may assume that there are no more than 1000 top sticks. The input is ended by the case with n=0. This case should not be processed.
Output
For each input case, print one line of output listing the top sticks in the format given in the sample. The top sticks should be listed in order in which they were thrown.
The picture to the right below illustrates the first case from input.
![](http://poj.org/images/2653_1.jpg)
Sample Input
5 1 1 4 2 2 3 3 1 1 -2.0 8 4 1 4 8 2 3 3 6 -2.0 3 0 0 1 1 1 0 2 1 2 0 3 1 0
Sample Output
Top sticks: 2, 4, 5. Top sticks: 1, 2, 3.
/* poj 2653 线段与线段相交 判断当前线段后面的线段是否与它相交即可 hhh-2016-05-04 22:10:50 */ #include <iostream> #include <vector> #include <cstring> #include <string> #include <cstdio> #include <queue> #include <cmath> #include <algorithm> #include <functional> #include <map> using namespace std; #define lson (i<<1) #define rson ((i<<1)|1) typedef long long ll; const int maxn = 200000; double eps = 1e-8; int tot; int n,m; double x1,x2,y1,y2,x3,x4,y3,y4; int sgn(double x) { if(fabs(x) < eps) return 0; if(x < 0) return -1; else return 1; } struct Point { double x,y; Point() {} Point(int _x,int _y) { x = _x,y = _y; } Point operator -(const Point &b)const { return Point(x-b.x,y-b.y); } double operator ^(const Point &b)const { return x*b.y-y*b.x; } }; struct Line { Point s,t; Line() {} Line(Point _s,Point _t) { s = _s; t = _t; } int operator &(const Line&b)const { if( sgn((s-t) ^ (b.s-b.t)) == 0) //通过叉积判断 { return 0; } return 1; } }; bool inter(Line l1,Line l2) { return max(l1.s.x,l1.t.x) >= min(l2.s.x,l2.t.x) && max(l2.s.x,l2.t.x) >= min(l1.s.x,l1.t.x) && max(l1.s.y,l1.t.y) >= min(l2.s.y,l2.t.y) && max(l2.s.y,l2.t.y) >= min(l1.s.y,l1.t.y) && sgn((l2.s-l1.s)^(l1.t-l1.s))*sgn((l2.t-l1.s)^(l1.t-l1.s)) <= 0 && sgn((l1.s-l2.s)^(l2.t-l2.s))*sgn((l1.t-l2.s)^(l2.t-l2.s)) <= 0; } int tans[maxn]; Line line[maxn]; int main() { while(scanf("%d",&n) && n) { memset(tans,1,sizeof(tans)); for(int i = 0; i < n; i++) { scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2); line[i] = Line(Point(x1,y1),Point(x2,y2)); } int num = n; for(int i = 0; i < n; i++) { for(int j = i+1; j < n; j++) { if(inter(line[i],line[j])) { tans[i] = 0; num--; break; } } } int cur = 0; printf("Top sticks: "); for(int i = 0; i < n; i++) { if(tans[i]) { cur++; if(num == cur) printf("%d.\n",i+1); else printf("%d, ",i+1); } } } return 0; }
相关文章推荐
- Extjs MVC架构 (官方文档翻译)【带源码】
- 创建tornado应用输出hello world
- Eclipse添加注释模板
- TensorFlow Machine Learning with Financial Data on Google Cloud Platform
- Python map reduce
- MySQL入门--创建数据库、显示警告信息、显示数据库、显示数据库创建信息、指定字符编码集
- LeetCode-237.Delete Node in a Linked List
- 如何去掉导航器下面的黑线
- Linux面试题(1)
- 闽江学院软件学院2015级学生职业人物访谈
- 九度OJ 1348-数组中的逆序对【逆序对模板】
- 前端性能优化小知识点(javascript)
- JavaScript Array和string的转换
- c语言学习笔记11
- JAVA-008类和对象
- 【数塔】1002 数塔取数问题【51nod】
- Apache配置防盗链
- poj 1269 线段与线段相交
- POJ 2479 Maximum sum(dp—求最大的两个不相交的字段和)
- 《浪潮之巅》读书笔记