线段判非严格相交+暴力——poj2653

O(n2)的暴力居然能过。。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
#define N 200005
#define db double

const db eps=1e-6;
int sign(db k){if (k>eps) return 1; else if (k<-eps) return -1; return 0;}
int cmp(db k1,db k2){return sign(k1-k2);}

struct point{
    db x,y;
    point(){}
    point(db x,db y):x(x),y(y){}
    point operator + (const point &k1) const{return (point){k1.x+x,k1.y+y};}
    point operator - (const point &k1) const{return (point){x-k1.x,y-k1.y};}
    point operator * (db k1) const{return (point){x*k1,y*k1};}
    point operator / (db k1) const{return (point){x/k1,y/k1};}
};
struct line{
    point p[2];
};
db cross(point k1,point k2){return k1.x*k2.y-k1.y*k2.x;}
int intersect(db l1,db r1,db l2,db r2){//跨立实验
    if(l1>r1)swap(l1,r1);if(l2>r2)swap(l2,r2);
    return cmp(r1,l2)!=-1 && cmp(r2,l1)!=-1;
}
int checkSS(point k1,point k2,point k3,point k4){
    return intersect(k1.x,k2.x,k3.x,k4.x) && intersect(k1.y,k2.y,k3.y,k4.y) &&
    sign(cross(k3-k1,k4-k1))*sign(cross(k3-k2,k4-k2))<=0 &&
    sign(cross(k1-k3,k2-k3))*sign(cross(k1-k4,k2-k4))<=0;
}

point p[N];
line l[N];
int n,vis[N],totp;

int main(){
    while(scanf("%d",&n) && n){
        memset(vis,0,sizeof vis);
        for(int i=1;i<=n;i++){
            point k1,k2;
            scanf("%lf%lf",&k1.x,&k1.y);
            scanf("%lf%lf",&k2.x,&k2.y);
            p[++totp]=k1;p[++totp]=k2;
            l[i].p[0]=k1;l[i].p[1]=k2;
        }
        for(int i=1;i<=n;i++){
            int flag=0;
            for(int j=i+1;j<=n;j++)
                if(checkSS(l[i].p[0],l[i].p[1],l[j].p[0],l[j].p[1])){
                    flag=1;break;
                }
            if(!flag)vis[i]=1;
        } 

        int flag=0;
        cout<<"Top sticks: ";
        for(int i=1;i<=n;i++)if(vis[i]){
            if(flag==0){
                cout<<i;
                flag=1;
            }
            else {
                cout<<", "<<i;
            }
        }
        puts(".");
    }
}

原文地址:https://www.cnblogs.com/zsben991126/p/12322552.html

时间: 2024-10-10 10:55:30

线段判非严格相交+暴力——poj2653的相关文章

HDU 1558 Segment set (并查集+线段非规范相交)

题目链接 题意 : 如果两个线段相交就属于同一集合,查询某条线段所属集合有多少线段,输出. 思路 : 先判断与其他线段是否相交,然后合并. 1 //1558 2 #include <cstdio> 3 #include <cstring> 4 #include <iostream> 5 #include <cmath> 6 #define eps 1e-8 7 #define zero(x) (((x) > 0 ? (x) : (-x)) < e

POJ 1436——Horizontally Visible Segments(线段树,区间染色+暴力)

Horizontally Visible Segments Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 4130   Accepted: 1511 Description There is a number of disjoint vertical line segments in the plane. We say that two segments are horizontally visible if they

(线段判交的一些注意。。。)nyoj 1016-德莱联盟

1016-德莱联盟 内存限制:64MB 时间限制:1000ms 特判: No通过数:9 提交数:9 难度:1 题目描述: 欢迎来到德莱联盟.... 德莱文... 德莱文在逃跑,卡兹克在追.... 我们知道德莱文的起点和终点坐标,我们也知道卡兹克的起点和 终点坐标,问:卡兹克有可能和德莱文相遇吗?,并且保证他们走的都是直线. 输入描述: 几组数据,一个整数T表示T组数据 每组数据 8个实数,分别表示德莱文的起点和终点坐标,以及卡兹克的起点和终点坐标 输出描述: 如果可能 输出 Interseeti

hihoCoder-1633 ACM-ICPC北京赛区2017 G.Liaoning Ship’s Voyage 线段与三角形规范相交

题面 题意:给你一个20*20的地图,起点(0,0),终点(n-1,n-1),有障碍的点为‘#’,每次可以向8个方向走一步,还给了一个三角形,除了障碍以外,到这8个方向上的点的线段如果没有与三角形相交,那么就可以到达,问最少步数 题解:主要是判断线段与三角形的相交,去年在现场和大多题解都是慢慢讨论,因为这个线段其实可以在边上,可以与三角形有交点, 今天重现才想到,只需要线段上有一点在三角形内部就不能走,坐标范围不大,直接枚举线段上200个点,挨着判断就行 在判断点在三角形内部时,注意顺时针逆时针

poj1410(判断线段和矩形是否相交)

题目链接:https://vjudge.net/problem/POJ-1410 题意:判断线段和矩形是否相交. 思路:注意这里的相交包括线段在矩形内,因此先判断线段与矩形的边是否相交,再判断线段的两端点是否在矩形内(因为是矩形,即凸多边形,直接用叉积判断即可,如果是一般的多边形,需要用射线法判断.) AC code: #include<cstdio> #include<algorithm> #include<cmath> #include<cstdlib>

线段与非无限平面相交检测

参考自<游戏编程精粹1>,用该方法除了知道是否相交以外还可以得到相交点,从而用于其他判断. 原文用到了平面方程Ax+By+Cz+D=0,通过三角形求出平面,然后用方程求出线段交点 这里直接使用平面,以下为Unity中的实现代码: using System.Collections; using System.Collections.Generic; using UnityEngine; public class Practice : MonoBehaviour { public Transfor

(计算几何 线段判交) 51nod1264 线段相交

1264 线段相交 给出平面上两条线段的两个端点,判断这两条线段是否相交(有一个公共点或有部分重合认为相交). 如果相交,输出"Yes",否则输出"No". 输入 第1行:一个数T,表示输入的测试数量(1 <= T <= 1000) 第2 - T + 1行:每行8个数,x1,y1,x2,y2,x3,y3,x4,y4.(-10^8 <= xi, yi <= 10^8) (直线1的两个端点为x1,y1 | x2, y2,直线2的两个端点为x3,y

POJ 1410 (线段是否与多边形相交 + 点是否在多边形内)

题目:传送门 题意:有 n 个测试样例,每个样例,输入四个点,前两个点代表一条线段,后两个点代表正方形的两个对角端点. #include <iostream> #include <stdio.h> #include <string.h> #include <algorithm> #include <queue> #include <map> #include <vector> #include <set> #i

HDU 4509 湫湫系列故事——减肥记II(线段树-区间覆盖 或者 暴力技巧)

http://acm.hdu.edu.cn/showproblem.php?pid=4509 题目大意: 中文意义,应该能懂. 解题思路: 因为题目给的时间是一天24小时,而且还有分钟.为了解题方便,我们将小时换成分钟,那么一天24小时,总共有1440分钟.顾我就可以把一天里的任意HH:MM时间换成分钟.就这样一天的时间就变成[0,1440]区间了. 因为所给的活动最多是5*10^5,如果把活动的时间在线段[0,1440]都修改,那么时间的复杂度最坏是O(5*10^5*1440). (1)方法一