POJ3304 Segment

题意简述

多测,每次给定\(n(n\le 100)\)条线段,请问是否能找到\(1\)条直线,使得所有线段在该直线上的投影有公共部分。

注:两点距离\(<10^{-8}\)被认为是相等的。

思路分析

题意转化一下,就是要我们找一条直线\(l_1\),穿过所有线段。这样对于任意直线\(l_2\perp l_1\),都满足题意。

我们又发现,如果存在\(l_2\),那么在规定“\(l_2\)必须穿过所有端点中的至少\(2\)个”的前提下,\(l_2\)仍然存在。

为什么呢?



比如这条红色直线就是我们找到的答案。



接下来将红色直线往一个方向移动,直到“再移一下就不能穿过所有线段”为止。显然此时一定有一个端点在直线上。



绕这个端点旋转红色直线,直到“再旋转一下就不能穿过所有线段”位置。显然此时直线上又多了一个端点。而同时满足题目要求。

接下来枚举两两线段之间的端点,判断过这两个端点的直线是否穿过所有线段即可。

判断线段穿过直线仅需一次跨立实验。即:

  • 设有线段\(AB\),直线\(CD\)。
  • 则如果\(\vec{AC}\)与\(\vec{AD}\)的方向关系和\(\vec{BC}\)与\(\vec{BD}\)的方向关系不同,则说明\(AB\)与\(CD\)相交。否则不相交。判断两向量方向关系需要用到叉积,具体可以见[题解]UVA10902 Pick-up Sticks中对跨立实验的说明。

我们可以发现,答案如果存在,则选择的两个端点一定可以不在一条线段上。所以枚举线段时\(j\)可以从\(i+1\)开始,但相应地需要特判一下\(n=1\)的情况,直接输出Yes即可。

另外,枚举出的两个端点如果重合(即距离\(<10^{-8}\))则不应参与计算。

时间复杂度\(O(n^3)\)。

Code

POJ真的是时代的眼泪了……编译器太老了,代码需要很多修改,因此就不放修改后的较为冗长的代码了。

重在理解,所以放一份修改前、比较简洁的代码实现,注意无法通过POJ编译。

点击查看代码
#include<bits/stdc++.h>
using namespace std;
struct point{double x,y;};
struct segment{point a,b;};
struct line{point a,b;};
double cross(point a,point b){return a.x*b.y-b.x*a.y;}
point vec(point a,point b){return {b.x-a.x,b.y-a.y};}
double dist(point a,point b){return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));}
bool intersect_line(line a,segment b){
return cross(vec(b.a,a.a),vec(b.a,a.b))*cross(vec(b.b,a.a),vec(b.b,a.b))<=0;
}
int t,n;
segment ts[110];
bool solve(line a){
if(dist(a.a,a.b)<1e-8) return 0;
for(int i=1;i<=n;i++)
if(!intersect_line(a,ts[i])) return 0;
return 1;
}
int main(){
cin>>t;
while(t--){
cin>>n;
for(int i=1;i<=n;i++)
cin>>ts[i].a.x>>ts[i].a.y>>ts[i].b.x>>ts[i].b.y;
bool f=0;
if(n==1) f=1;
else{
for(int i=1;i<n;i++){
for(int j=i+1;j<=n;j++){
if(solve({ts[i].a,ts[j].a})||solve({ts[i].a,ts[j].b})||
solve({ts[i].b,ts[j].a})||solve({ts[i].b,ts[j].b})){f=1;break;}
}
}
}
if(f) cout<<"Yes!\n";
else cout<<"No!\n";
}
}

[题解]POJ3304 Segment的更多相关文章

  1. [题解] [HEOI2013] Segment

    题面 题解 李超线段树 为了与机房大佬 HYJ 同步伐 学习笔记请移步 yyb的博客 Code #include <algorithm> #include <iostream> ...

  2. Bzoj 3165 [Heoi2013]Segment题解

    3165: [Heoi2013]Segment Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 668  Solved: 276[Submit][Sta ...

  3. [LightOJ1240]Point Segment Distance 题解

    题意简述 原题LightOJ 1240,Point Segment Distance(3D). 求三维空间里线段AB与C. 题解 我们设一个点在线段AB上移动,然后发现这个点与原来的C点的距离呈一个单 ...

  4. Lintcode247 Segment Tree Query II solution 题解

    [题目描述] For an array, we can build a Segment Tree for it, each node stores an extra attribute count t ...

  5. ZOJ 3962 Seven Segment Display(数位DP)题解

    题意:给一个16进制8位数,给定每个数字的贡献,问你贡献和. 思路:数位DP,想了很久用什么表示状态,看题解说用和就行,其他的都算是比较正常的数位DP. 代码: #include<iostrea ...

  6. 【题解】Luogu P4097 [HEOI2013]Segment

    原题传送门 这珂以说是李超线段树的模板题 按着题意写就行了,时间复杂度为\(O(n\log^2n)\) #include <bits/stdc++.h> #define N 40005 # ...

  7. 题解-hzy loves segment tree I

    Problem 题目概要:给定一棵 \(n\) 个节点的树,点有点权,进行 \(m\) 次路径取\(\max\)的操作,最后统一输出点权 \(n\leq 10^5,m\leq 5\times 10^6 ...

  8. POJ3304:Segments——题解

    http://poj.org/problem?id=3304 题目大意:给n条线段,求是否存在一条直线,将所有线段投影到上面,使得所有投影至少交于一点. ——————————————————————— ...

  9. BZOJ3165 & 洛谷4097:[HEOI2013]Segment——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=3165 https://www.luogu.org/problemnew/show/P4097 要求 ...

  10. CF1175E Minimal Segment Cover 题解

    题意:给出\(n\)个形如\([l,r]\)的线段.\(m\)次询问,每次询问区间\([x,y]\),问至少选出几条线段,使得区间\([x,y]\)的任何一个部位都被至少一条线段覆盖. 首先有一个显然 ...

随机推荐

  1. MySQL SQL语句书写顺序和执行顺序

    目录 SQL语句书写顺序和执行顺序 MySql执行顺序理解 实例 知识扩展 on和where的区别 limit 分页 结束语 Reference SQL语句书写顺序和执行顺序 (7) SELECT ( ...

  2. Winform高级技巧-界面和代码分离的实践案例

    办法总比困难多(不会或不想用WPF MVVM模式也可以搞工控自动化和上位机编程)... 正文 活到老就该学到老.但是难道我们不可以偷懒么,老技术指哪打哪,游刃有余,如果已经炉火纯青,那么解决问题又快又 ...

  3. Python中的cls变量

    技术背景 在Python的类型设计中,有时候会遇到一个cls参数.其实cls参数就是一个约定俗成的名称,用其他的名字也能正常运行但不建议这么用.它的作用类似于实例方法中的self参数,代表的是类本身, ...

  4. C# 异步编程:从 async/await 到 Task 并行库的全面解析

    引言 在现代软件开发中,处理高并发和耗时操作是一个常见的挑战.C# 提供了强大的异步编程模型,它允许程序在执行耗时操作时不会阻塞主线程,从而提高程序的响应性和性能.其中,async/await 关键字 ...

  5. 倒带ChunJun,同心前行|2022年度回顾&2023年共建规划

    ChunJun是一个开始于2018年的批流一体数据集成框架项目,原名FlinkX.2022年2月22日,在FlinkX进行初版开源的整整四年后,技术团队决定对FlinkX进行整体升级,并更名为Chun ...

  6. 开源公开课丨ChunJun数据传输模块介绍

    一.直播介绍 之前的内容,我们为大家分享了ChunJun数据还原的DDL模块,以及ChunJun同步Hive事务表,本期我们为大家分享ChunJun数据传输模块介绍. 本次直播我们将从ChunJun数 ...

  7. 如何基于three.js(webgl)引擎架构,实现3D机房园区,数据中心消防系统

    前言前面的文章我们已经详细介绍了数据中心机房的关键知识点,以及消防领域的基础知识.在此基础上,本文将深入探讨展示消防在数据中心这一特殊场景中的应用,特别是气体消防系统的应用模拟及发生火灾时逃生路径规划 ...

  8. 经典记忆卡片游戏html代码

    记忆卡片游戏是一款简单而富有挑战性的经典游戏,旨在锻炼玩家的记忆力和观察力.游戏通常由一组图案相同的卡片组成,玩家需要通过翻转卡片找到匹配的对.每当找到一对匹配的卡片时,玩家将获得一定的分数或奖励,游 ...

  9. Blazor学习之旅(10)多语言+本地化

    大家好,我是Edison. 在上一篇我提到了接下来会介绍一下如何在Blazor中实现多语言,这就安排上了. 多语言+本地化的背景 在Web应用开发中,我们可能会有一些需要多语言+本地化的场景,特别在一 ...

  10. JS是门单线程语言

    多线程语言 像java.python等 它们都是仅支持同步语言,像读取文件.网络请求这种任务 花费时间很长,它们只能长时间等着. 遇到其他紧急任务,Java 可以再开一个线程去处理. 多线程语言的好处 ...