Pick-up sticks

Time Limit: 3000MS Memory Limit: 65536K



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.

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.

Hint

Huge input,scanf is recommended.

Source

Waterloo local 2005.09.17

这道题的数据范围是n≤100000" role="presentation" style="position: relative;">n≤100000n≤100000,其实我也很好奇我是怎么用O(Tn2)" role="presentation" style="position: relative;">O(Tn2)O(Tn2)的算法跑过去的,这道题的思路很简单,照着提议模拟一边就可以了,对于每一条线段,我们判断在它之后的线段有没有与它相交的,如果有就打上标记,没有就不打标记,最后把所有没打标记的线段输出就可以了。

代码如下:

#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 100005
using namespace std;
struct pot{double x,y;};
struct line{pot a,b;}l[N];
bool vis[N];
inline double cross(pot a,pot b,pot c){return (a.x-c.x)*(b.y-c.y)-(a.y-c.y)*(b.x-c.x);}
inline bool across(line m,line n){
    if(cross(m.a,n.b,n.a)*cross(m.b,n.b,n.a)<0&&cross(n.a,m.b,m.a)*cross(n.b,m.b,m.a)<0)return true;
    return false;
}
int n;
int main(){
    while(scanf("%d",&n)==1){
        if(n==0)break;
        for(int i=0;i<n;++i)scanf("%lf%lf%lf%lf",&l[i].a.x,&l[i].a.y,&l[i].b.x,&l[i].b.y);
        memset(vis,false,sizeof(vis));
        for(int i=0;i<n;++i){
            if(vis[i])continue;
            for(int j=i+1;j<n;++j){
                if(across(l[i],l[j])){
                    vis[i]=true;
                    break;
                }
            }
        }
        bool f=false;
        printf("Top sticks:");
        for(int i=0;i<n;++i){
            if(!vis[i]){
                if(!f){printf(" %d",i+1),f=true;}
                else printf(", %d",i+1);
            }
        }
        puts(".");
    }
    return 0;
}

2018.07.03 POJ 2653 Pick-up sticks(简单计算几何)的更多相关文章

  1. 2018.07.03 POJ 2318 TOYS(二分+简单计算几何)

    TOYS Time Limit: 2000MS Memory Limit: 65536K Description Calculate the number of toys that land in e ...

  2. 2018.07.03 POJ 1279Art Gallery(半平面交)

    Art Gallery Time Limit: 1000MS Memory Limit: 10000K Description The art galleries of the new and ver ...

  3. 2018.07.03 POJ 3348 Cows(凸包)

    Cows Time Limit: 2000MS Memory Limit: 65536K Description Your friend to the south is interested in b ...

  4. 【POJ 2653】Pick-up sticks 判断线段相交

    一定要注意位运算的优先级!!!我被这个卡了好久 判断线段相交模板题. 叉积,点积,规范相交,非规范相交的简单模板 用了“链表”优化之后还是$O(n^2)$的暴力,可是为什么能过$10^5$的数据? # ...

  5. 2018.07.04 POJ 1654 Area(简单计算几何)

    Area Time Limit: 1000MS Memory Limit: 10000K Description You are going to compute the area of a spec ...

  6. 2018.07.08 POJ 2481 Cows(线段树)

    Cows Time Limit: 3000MS Memory Limit: 65536K Description Farmer John's cows have discovered that the ...

  7. 2018.07.04 POJ 1265 Area(计算几何)

    Area Time Limit: 1000MS Memory Limit: 10000K Description Being well known for its highly innovative ...

  8. 2018.07.04 POJ 1696 Space Ant(凸包卷包裹)

    Space Ant Time Limit: 1000MS Memory Limit: 10000K Description The most exciting space discovery occu ...

  9. 2018.07.04 POJ 1113 Wall(凸包)

    Wall Time Limit: 1000MS Memory Limit: 10000K Description Once upon a time there was a greedy King wh ...

随机推荐

  1. jsp button onclick

    <input type="button" value="MD5哈希转换" onclick="javascript:document.getEle ...

  2. mysql 1292-Truncated incorrect double value

    sql = "select id from company where date_year_month = %s" % "2017-3" 出错 将%s改为'%s ...

  3. python引用,浅复制,深复制

    引用:可以按照指针理解 copy:只复制父元素,所以如果一个列表嵌套了列表,那么浅复制后原变量和复制后的变量还是引用相同的子元素,子元素修改后,两个变量还会对应改变. deepcopy:复制父元素和子 ...

  4. 系统批量运维管理器pexpect的使用

    # pip install pexpect 或 # easy_install pexpect 1 #!/usr/bin/env python 2 import pexpect 3 child = pe ...

  5. Delphi笔记-自定义提示窗口

    unit pbHint; interface uses Windows, Controls, Forms, Graphics; type TPBHint=class(THintWindow) //要自 ...

  6. hive sql split 分隔符

    Hive字符串分割函数 split(str, regex) - Splits str around occurances that match regexTime taken: 0.769 secon ...

  7. python的map函数和reduce函数(转)

    map函数 map()函数 map()是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回. 例 ...

  8. Electron 的解释, 什么是Electron

    https://wizardforcel.gitbooks.io/electron-doc/content/development/build-instructions-windows.html

  9. Oracle Client安装报错

    Oracle Client安装报错:引用数据不可用于验证此操作系统分发的先决条件 http://tunps.com/p/11797.html 原因是Oracle Client 11g版本不支持最新的W ...

  10. mysql 常用option

    [mysql 常用option] --host=host_name, -h host_name Connect to the MySQL server on the given host. --por ...