POJ3304 Segments

BioEmu:微软黑科技炸场!生成式AI重构蛋白质模拟:千倍效率碾压传统计算,新药研发周期砍半 BioEmu 是微软推出的生成式深度学习系统,可在单个 GPU 上每小时生成数千种蛋白质结构样本,支持模拟动态变化、预测热力学性质,并显著降低计算成本。 阅读详情

Segments
Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 5604 Accepted: 1630

Description

Given n segments in the two dimensional space, write a program, which determines if there exists a line such that after projecting these segments on it, all projected segments have at least one point in common.

Input

Input begins with a number T showing the number of test cases and then, T test cases follow. Each test case begins with a line containing a positive integer n ≤ 100 showing the number of segments. After that, n lines containing four real numbers x1 y1 x2 y2 follow, in which (x1, y1) and (x2, y2) are the coordinates of the two endpoints for one of the segments.

Output

For each test case, your program must output "Yes!", if a line with desired property exists and must output "No!" otherwise. You must assume that two floating point numbers a and b are equal if |a - b| < 10-8.

Sample Input

3
2
1.0 2.0 3.0 4.0
4.0 5.0 6.0 7.0
3
0.0 0.0 0.0 1.0
0.0 1.0 0.0 2.0
1.0 1.0 2.0 1.0
3
0.0 0.0 0.0 1.0
0.0 2.0 0.0 3.0
1.0 1.0 2.0 1.0

Sample Output

Yes!
Yes!
No!

Source


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

const double eps = 1e-8;

struct LPoint{
	double x, y;
};

struct LLine{
	LPoint bg, ed;
}line[110];

int dblcmp(double a, double b){
	if (a - b >= eps) return 1;
	if (b - a >= eps) return -1;
	return 0;
}

double VecPro(double x1, double y1, double x2, double y2){
	return (x1 * y2 - x2 * y1);
}

double NumPro(double x1, double y1, double x2, double y2){
	return (x1 * x1 + y1 * y2);
}
//直线ab,与线段pq是否相交
int IsCross(LPoint a, LPoint b, LPoint p, LPoint q){
	if (dblcmp(VecPro(a.x - b.x, a.y - b.y, p.x - b.x, p.y - b.y), 0) *
	    dblcmp(VecPro(a.x - b.x, a.y - b.y, q.x - b.x, q.y - b.y), 0) <= 0)
		return 1;
	else return 0;
}

double Dis(LPoint a, LPoint b){
	return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));
}

int main(){
	int i, j, k;
	int n, T;
	scanf("%d", &T);
	while(T--){
		scanf("%d", &n);
		for (i = 0; i < n; i++){
			scanf("%lf %lf %lf %lf", &line[i].bg.x, &line[i].bg.y, &line[i].ed.x, &line[i].ed.y);
		}
		if (n <= 2) k = n;
		else{
			k = 0;
			for (i = 0; i < n; i++){
				for (j = i + 1; j < n; j++){
					if (dblcmp(Dis(line[i].bg, line[j].bg), 0) > 0){
						for (k = 0; k < n; k++){
							if (!IsCross(line[i].bg, line[j].bg, line[k].bg, line[k].ed)) break;
						}
						if (k >= n) break;
					}
					if (dblcmp(Dis(line[i].bg, line[j].ed), 0) > 0){
						for (k = 0; k < n; k++){
							if (!IsCross(line[i].bg, line[j].ed, line[k].bg, line[k].ed)) break;
						}
						if (k >= n) break;
					}
					if (dblcmp(Dis(line[i].ed, line[j].bg), 0) > 0){
						for (k = 0; k < n; k++){
							if (!IsCross(line[i].ed, line[j].bg, line[k].bg, line[k].ed)) break;
						}
						if (k >= n) break;
					}
					if (dblcmp(Dis(line[i].ed, line[j].ed), 0) > 0){
						for (k = 0; k < n; k++){
							if (!IsCross(line[i].ed, line[j].ed, line[k].bg, line[k].ed)) break;
						}
						if (k >= n) break;
					}
				}
				if (k >= n) break;
			}
		}
		if (k >= n) printf("Yes!\n");
		else printf("No!\n");
	}	
	return 0;
}
/*
题意:给n个线段,问是否存在一直线,使所有线段在该直线上投影相交于同一点
转帖discuss里hanjialong的思路:
	首先题中的要求等价于:存在一条直线l和所有的线段都相交。
	证明:若存在一条直线l和所有线段相交,作一条直线m和l垂直,则m就是题中要求的直线,所有线段投影的一个公共点即为垂足。(l和每条线段的交点沿l投影到m上的垂足处)
	反过来,若存在m,所有线段在m上的投影有公共点,则过这点垂直于m作直线l,l一定和所有线段相交。

	然后证存在l和所有线段相交等价于存在l过某两条线段的各一个端点且和所有线段相交。
	充分性显然。必要性:若有l和所有线段相交,则可保持l和所有线段相交,左右平移l到和某一线段交于端点停止(“移不动了”)。然后绕这个交点旋转。也是转到“转不动了”(和另一线段交于其一个端点)为止。这样就找到了一个新的l。

	于是本题可归结为枚举两两线段的各一个端点,连一条直线,再判断剩下的线段是否都和这条直线有交点。
计算几何还是难想啊...
然后就是俩点注意,n <= 2特判为yes, 作为直线的俩点不能重合
dblcmp写错了,贡献一WA...真是不细心啊...
*/


Sigrity Power SI Model Extraction模式如何提取电源网络的S参数和阻抗操作指导(一) 34. 默认格式是BNP format格式,会被Sigrity识别的S参数文件,在仿真完成后,默认会在文件夹中生成bnp和ckt(MCP)文件,无需这步操作。由于port设置的ref Z是50ohm,实际上电源网络的阻抗是没有这么高的,所以S参数回损曲线是基本上全反射的一个状态。Sigrity PowerSI是频域电磁场仿真工具,以下图为例介绍如果用它观测电源的网络的S参数以及阻抗的频域曲线.42. Spice格式的加载进来图标是橙色的,BNP格式的图标是灰色的。 阅读详情

相关推荐

电源工程师必看:平均电流模式BUCK双环控制详解(从传递函数到Psim仿真)

本文详细解析了平均电流模式BUCK变换器的双环控制策略,从传递函数推导到Psim仿真实现。针对电源工程师关注的环路设计和稳定性问题,深入比较了电压模式、峰值电流模式和平均电流模式的优缺点,并提供了12V/3A BUCK变换器的完整设计案例,帮助工程师掌握平均电流控制这一中高功率应用的首选方案。

weixin_42696271的博客 398

POJ3304

n很小,只有100.可以枚举任意两条线段的两个端点,叉积判断是否和其他所有线段相交。时间复杂度O(n3)O(n^{3})O(n3) 证明:若有直线l与所有线段相交,则可保持l和所有线段相交,左右平移l到和某一个线段交于端点时无法在移动了,然后绕这个交点旋转,到转不动了,将会与另一线段交于一端点。 #include<cstdio> #include<iostream> #i...

tirion_chenrui的博客 421

告别裸机:在FreeRTOS上为STM32移植SOEM EtherCAT主站的思路与实战

本文详细介绍了在FreeRTOS环境下为STM32移植SOEM EtherCAT主站的工程实践。通过重构任务调度模型、优化内存管理和中断响应,成功将通信周期抖动控制在±100ns以内,满足工业控制系统的严苛实时性要求。文章包含完整的移植策略、性能优化方法和实测数据,为开发者提供了一套可靠的EtherCAT主站解决方案。

weixin_30342363的博客 388

POJ 3304 Segments(计算几何)

题意:给定一些线段,问能否找出一条直线,穿过所有线段 思路:如果存在一条直线,那么必然有一条直线是过已有的两点,那么就枚举两点,然后去判断是否跟所有线段有交点即可 代码: #include #include #include #include using namespace std; struct Point { double x, y; Point() {}

Remilia's 848

QT6与QT5安装全攻略:从下载到环境配置一站式指南

本文提供了一份详尽的QT6与QT5安装教程,涵盖从版本选择、在线安装器使用到环境变量配置的全过程。针对新手常见痛点,重点对比了QT6与QT5的安装差异,并给出了MinGW与MSVC编译器的选择建议,旨在帮助开发者快速搭建稳定可用的QT开发环境,避免常见错误。

weixin_29216353的博客 312

NAT反向代理技术的实现(外网访问内网)

NAT反向代理技术的实现(外网访问内网)(版权所有,引用 请联系作者,注明出处) NAT技术是网络中的重要应用之一。当有一个场景:内网搭建了服务器,需要外网访问时,可以借助NAT映射来实现。如:单位建立了一个Web服务器,我们希望在员工回家之后,依然可以访问到它,那怎么实现呢? 下面的拓扑图,就用来示范这个应用反面场景的实现过程。 一、题目要求: 地址配置如图。使用静态路由: 1、配置右侧交换机2950T,实现单臂路由; 2、配置路由使网络连通; 3、配置NAT访问,实现外网对风网服务器的

joyousmime的博客 8488

Segments POJ - 3304

判读线段与直线相交 #include #include using namespace std; /* 投影在一条线上,有交点,等价于有一条线可以穿过所有的线段 读入所有线段,然后选取坐标原点以及一条线段,然后旋转,判断是否 与其他的线段相交 看了题解,枚举线段端点,如果有以其中任意两点为端点的线段与所有线段香蕉,就符合题意 */ const double ESP = 1e-10; int

LutherLau 299

(35)远程识别(又称无人机识别)(一)

Ardupilot官网关于《Peripheral Hardware》的翻译 —《(35) 远程识别(又称无人机识别)》。

无人机开发(开源Ardupilot) 4万+

C - Segments POJ - 3304 (判断线段相交)

题目链接:https://vjudge.net/contest/276358#problem/C 题目大意:给你n条线段,问你是否存在一条线段使得所有的线段在这条直线的投影至少具有一个交点? 具体思路:这个题转换一下思路,假设存在一条直线与所有的线段都相交,那么这条直线的垂线就是题目中所求的直线,我们可以把所有的端点都遍历一遍,询问一下看有没有符合条件的直线就可以了。 AC代码: ...

diaomeijiao3430的博客 158

补丁1.0:使用Eviews做ADF检验

补丁1.0:使用Eviews做ADF检验

Jet4505的博客 1961

【AI技术赋能有限元分析应用实践】Abaqus有限元分析与深度学习结合20个案例与有限元分析数据来源方法说明

结合 Abaqus 和深度学习,数据的获取和处理是关键的一步。通过从仿真、实验、公开数据库或合成数据中获取数据,经过预处理后,可以将其用于训练深度学习模型。最终,将训练好的深度学习模型与 Abaqus 集成,用于材料行为预测、结构优化、非线性分析、损伤预测等任务,从而提升仿真效率和精度。

源代码杀手的博客 3213

ACM-计算几何之Segments——poj3304

ACM 计算几何 Segments poj3304

继续激情,继续奋斗。 1631

dolphinscheduler集群服务一键安装启动实现流程剖析

通过以上分析我们基本梳理清楚了整个dolphinscheduler项目的一键安装启动逻辑, 我们现在在通过一张图正好理一下整个实现流程。关于一键停止集群服务及一件查询集群各个角色服务实例运行状态的实现也都在stop-all.sh/status-all.sh及dolphinscheduler-daemon.sh这三个脚本中, 有兴趣自行研究。写这篇文章的核心目的不仅在于给大家分享如何优秀的开源项目的一键安装部署的实现过程。

最爱嫣夜来 1207

poj 3304 Segments

poj 3304 Segments (计算几何水题) 链接:http://poj.org/problem?id=3304 题意:找出一条直线,使得给出的所有线段在这个直线上的投影有交集。 思路:找出一条直线,使得其与所给的线段有交点。枚举每一个线段的端点,假设直线经过某两点,判断直线是否与其它线段相交。枚举这些点的位置即可。主意其中的输出大小写,我wa了一个晚上就是输出的大小写写错...

dengyun9338的博客 186

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

POJ 3304 Segments

POJ 3304 Segments    该题是本人看了他人的博客后才懂得,至今也未理解为何,n条线段与一条直线相交,而这条直线一定会经过其中两条线段的两个端点,如果哪位大牛知道,请赐教。。 #include #include #define EPS 1e-8 const int MAXN=102; int n; typedef struct NODE1 { double x,y; }

YouthDance 747

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

poj3304 Segments【计算几何】

C - SegmentsPOJ - 3304最近开始刷计算几何了 公式好多完全不会数学不行 几何不行 记忆力不行 当机查的题解 就当复习吧 这套专题拿来熟悉一下计算几何模板#include <iostream> #include<stdio.h> #include<math.h> using namespace std; ...

weixin_30827565的博客 89

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

POJ 3304 Segments 判断直线和线段相交

POJ 3304 Segments 题意:给定n(n<=100)条线段,问你是否存在这样的一条直线,使得所有线段投影下去后,至少都有一个交点。 思路:对于投影在所求直线上面的相交阴影,我们可以在那里作一条线,那么这条线就和所有线段都至少有一个交点,所以如果有一条直线和所有线段都有交点的话,那么就一定有解。 怎么确定有没直线和所有线段都相交?怎么枚举这样的直线?思路就是固定两个点,这两...

weixin_30532369的博客 129

poj3304—Segments

题目链接:传送门 Segments Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 14510   Accepted: 4613 Description Given n segments in the two dimensional space, wr

zhiyuanjiang的博客 300

poj3304Segments

判断直线和线段是否相交的题目。 题意是给你n条线段,判断是否存在一条直线,使所有线段到这条直线的投影至少有一个交点。 #include #include #include #include #include using namespace std; const int maxn =210; const double eps = 1e-8; int sig(double d) { ret

I fight, so you don't have to 613
上一篇: POJ 1269 Intersecting Lines
下一篇: 背包优化
cmonkey
博客等级 码龄17年 50粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值