[题解]POJ3304 Segment

news/2024/9/19 17:04:53/文章来源:https://www.cnblogs.com/Sinktank/p/18304769

POJ3304 Segment

题意简述

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

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

思路分析

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

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

为什么呢?
image
比如这条红色直线就是我们找到的答案。
image
接下来将红色直线左移,直到“再移一下就不能穿过所有线段”为止。显然此时一定有一个端点在直线上。
image
绕这个端点旋转红色直线,直到“再旋转一下就不能穿过所有线段”位置。显然此时直线上又多了一个端点。而同时满足题目要求。

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

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

  • 设有线段\(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";}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/744618.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#开发socket通信winfrom

UI界面: 实现: 服务端Server :开启服务端按钮点击事件Thread threadWatch = null; //负责监听客户端的线程Socket socketWatch = null; //负责监听客户端的套接字private void button3_Click(object sender, EventArgs e){try{//定义一个套接字用于监听客户端发来的信息 …

车载以太网交换机入门基本功(2)— 初识VLAN

这么方便的VLAN,究竟是用了什么“魔法”做到的呢? 在《交换机入门基本功 -上》提到,交换机在物理层面划分通信区域并产生局域网(Local Area Network, LAN)。局域网具有一个特点:连线拓扑一旦确定,一定时间内不会发生通信区域的变动。在实际通信过程中,广播报文和…

基础知识

主要是怕忘记,就当简单的记事本了,随时补充( 32位&64位 32(x86) 函数参数在函数返回地址上方 64(x64) 前六个参数依次保存在 RDI、RSI、RDX、RCX、R8、R9寄存器中 剩余的保存在栈上 各寄存器主要功能系统调用 步骤 1.加载系统调用号 将系统调用号加载到rax寄存器 2.准备…

NewSQL-TiDB 分布式数据库运维技术从0到1实战入门

一、TiDB简介 TiDB 是一种新型的分布式数据库,它结合了传统关系型数据库的易用性和 NoSQL 数据库的高性能、可扩展性。作为一款 NewSQL 数据库,TiDB 旨在解决大规模在线事务处理(OLTP)系统的需求,同时支持 JSON、图形等非关系型数据结构。 TiDB 的优势兼容性:TiDB 兼容 M…

W外链有哪些功能?短网址/活码/私信卡片

在当今互联网高速发展的时代,短网址生成平台已经成为网络营销、社交媒体推广以及个人用户分享链接时不可或缺的工具。在众多短网址生成平台中,W外链短网址生成平台凭借其独特的功能和优势,赢得了广大用户的青睐。本文将详细介绍W外链短网址生成平台的核心功能,帮助读者更好…

[FireshellCTF2020]Caas 1

c语言编译器 打开之后看见是个输入框,随便输入然后发现报错是c语言的,尝试输出helloword #include <stdio.h>int main() {printf("Hello, World! \n");return 0; }给我们了一个文件,运行一下编译器没跑了,直接 #include "/flag"报错中漏了flag

网页文件加载失败如何重试

本文由 ChatMoney团队出品 在我们开发网站应用时,我们可能会遇到脚本加载失败的情况,导致脚本加载失败的原因有很多,比如用户的网络问题、终端设备问题、用户浏览器版本等诸多因素。 解决方案 在 JavaScript 中,我们可以创建一个监听来监听脚本加载失败的情况,然后针对加载…

rust各种库

ndarray ndarray 是 NumPy 库中的一个核心数据结构,它是一个用于表示多维数组的对象。ndarray 在存储和操作大型多维数组时非常高效,广泛应用于科学计算、数据分析、机器学习等领域。 在 Rust 开发中,ndarray 库可以作为替代 NumPy 库。 Github 地址:https://github.com/r…

mormot2 api-jwt签名和验签

mormot2 api-jwt签名和验签api-jwt签名和验签 1)根据指定的参数来生成签名2)验证签名并获取参数的值 本文来自博客园,作者:{咏南中间件},转载请注明原文链接:https://www.cnblogs.com/hnxxcxg/p/18304797

记一次Burp与NEW_xp_CAPTCHA工具联动爆破验证码

首先下载NEW_xp_CAPTCHA工具 地址:https://github.com/smxiazi 我下载的是大佬直接发布的打包好的环境,包括对应python3.6.6与NEW_xp_CAPTCHA工具脚本下载完后直接点击运行即可本地访问http://127.0.0.1:8899/,看到这个页面,证明没问题然后就是burp导入插件jar。这里要下载…

nginx对访问路径进行限制【部分接口可以内外网访问、剩余接口只可以内网访问】

前言 最近这段时间的项目被查出了安全漏洞、然后做了一些安全措施的整改。整改后、BOSS又提了个很有意思的思路。 涉及到小程序端的请求接口、内外网都可以访问。 涉及到后台管理的请求接口、只允许内网访问。开干开干 由于项目引进了gateway网关、一开始的时候。我…

ASP.NET Core-本地化

1.安装扩展ResXManager用于管理本地化资源文件 2.添加资源文件Resource.resx 使用工具ResXManager增加其他资源文件,具体参考ResXManager使用 3.注册本地化public static class ServiceCollectionExtensions {public static IServiceCollection AddLanguage(this IServiceColl…