当前位置: 首页 > news >正文

2021 ICPC 昆明 I Mr Main and Windmills(直线与线段的交点)

2021 ICPC 昆明 I Mr. Main and Windmills(直线与线段的交点)

I Mr. Main and Windmills

大意:给出一条线段 , 一个人从线段的起点走到线段的终点 , 线段的一侧有若干风车 , 当前的人在线段上的每一个位置观察风车都会得到一个顺序 。多次询问第 i 号风车被观察的位置第k次改变时人在线段上的位置。

思路:不难发现 , 两个风车交换位置当且仅当人走过 两风车所在直线与线段交点的时候 , 两两枚举风车求直线与线段交点 , 然后根据和起始点的距离排序后根据要求输出即可。

易错点:这里线段与直线求交会有一个易错点。

如果先求 线段所在直线与风车直线的交点(line_make_point) , 然后再判断交点是否在线段上(point_on_segment) , 这样误差会巨大。因为直线求交会有除法 , 求出的交点存在误差 ,然后判断点在线段上时会用到叉积 , 叉积的几何意义就是形成三角形的面积 , 如果线段特别特别长 , 叉积就会很大 , 从而在这里产生错误。

if(!line_make_point(l , r , now)) continue;
if(!point_on_segment(now , st , ed)) continue;

解决方法:

1. 对于求交问题 , 先判断在求交

对应在这里 , 就可以先判断线段和直线是否相交(toleft) , 相交求交点即可 , 这样是不会有判断误差的产生的。

if(toleft(st , p[i] , p[j]) * toleft(ed , p[i] , p[j]) > 0) continue;
line_make_point(l , r , now);

2. double 换成 long double , 容限(eps) 调大即可

这里推荐第一种 , 第一种更规范

#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define IOS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define int long long
const int N = 1e3 + 10;
const int mod = 1e9 + 7;
typedef pair<int,int>PII;//--------------------------------------------------------------
const double eps = 1e-9;
const double pi = acos(-1);
inline double sqr(double x) {return x * x;} //平方
int sign(double x){if(fabs(x) < eps) return 0;if(x > 0) return 1;return -1;
}//符号
struct point{double x , y;point(){}point(double a , double b) : x(a) , y(b){}friend point operator + (const point &a , const point &b){return point(a.x + b.x , a.y + b.y);}friend point operator - (const point &a , const point &b){return point(a.x - b.x , a.y - b.y);}friend bool operator == (const point &a , const point &b){return !sign(a.x - b.x) && !sign(a.y - b.y);}friend point operator * (const point &a , const double &b){return point(a.x * b , a.y * b);}friend point operator * (const double &a , const point &b){return point(a * b.x , a * b.y);}friend point operator / (const point &a , const double &b){return point(a.x / b , a.y / b);}//向量模长 double norm(){ return sqrt(sqr(x) + sqr(y));}
}; struct line{point a , b;line(){}line(point x , point y) : a(x) , b(y) {}
};double det(const point &a , const point &b){return a.x * b.y - a.y * b.x;
}//叉积 判断两点共线 double dot(const point &a , const point &b){return a.x * b.x + a.y * b.y;
}//点积double dist(const point &a , const point &b){return (a - b).norm();
}//两点距离point rotate_point(const point &a , const point &p , double A){double tx = p.x - a.x , ty = p.y - a.y;return point(a.x + tx * cos(A) - ty * sin(A) , a.y + tx * sin(A) + ty * cos(A));
}// p 点 绕 a 点逆时针旋转 A 弧度int toleft(const point &p , const point &a , const point &b) {return sign(det(b - a , p - a));// 1 左 0 上 -1 右
}//只适用凸多边形//判断点 p 是否在线段 st 上(包括端点)
bool point_on_segment(point p , point s , point t){return sign(det(p - s , t - s)) == 0 && sign(dot(p - s , p - t)) <= 0;
}bool parallel(line a , line b){return !sign(det(a.a - a.b , b.a - b.b));
}bool line_make_point(line a , line b , point &res){if(parallel(a , b)) return 0;double s1 = det(a.a - b.a , b.b - b.a);double s2 = det(a.b - b.a , b.b - b.a);res = (s1 * a.b - s2 * a.a) / (s1 - s2);return 1;
}
//--------------------------------------------------------------
//--------------------------------------------------------------int n , m;
point st , ed , p[N] , now;
double x , y;
int h , k;vector<tuple<double , double , double>>ans[N];signed main(){IOScout << fixed << setprecision(10);cin >> n >> m;cin >> x >> y;st = point{x , y};cin >> x >> y;ed = point{x , y};for(int i = 1 ; i <= n ; i ++){cin >> x >> y;p[i] = point{x , y};}line l = line{st , ed};for(int i = 1 ; i <= n ; i ++){for(int j = i + 1 ; j <= n ; j ++){line r = line{p[i] , p[j]};if(toleft(st , p[i] , p[j]) * toleft(ed , p[i] , p[j]) > 0) continue;line_make_point(l , r , now);ans[i].emplace_back(now.x , now.y , dist(now , st));ans[j].emplace_back(now.x , now.y , dist(now , st));} }for(int i = 1 ; i <= n ; i ++) sort(ans[i].begin() , ans[i].end() , [&](tuple<double , double , double> a , tuple<double , double , double> b){return get<2>(a) < get<2>(b);});for(int i = 1 ; i <= m ; i ++){cin >> h >> k;if(ans[h].size() < k){cout << "-1\n";}else{auto [x , y , z] = ans[h][k - 1];cout << x << " " << y << "\n";}}return 0;
}
//freopen("文件名.in","r",stdin);
//freopen("文件名.out","w",stdout);

相关文章:

2021 ICPC 昆明 I Mr Main and Windmills(直线与线段的交点)

2021 ICPC 昆明 I Mr. Main and Windmills(直线与线段的交点) I Mr. Main and Windmills 大意&#xff1a;给出一条线段 &#xff0c; 一个人从线段的起点走到线段的终点 &#xff0c; 线段的一侧有若干风车 &#xff0c; 当前的人在线段上的每一个位置观察风车都会得到一个顺…...

SpringCloudAlibaba Gateway(一)简单集成

SpringCloudAlibaba Gateway(一)简单集成 随着服务模块的增加&#xff0c;一定会产生多个接口地址&#xff0c;那么客户端调用多个接口只能使用多个地址&#xff0c;维护多个地址是很不方便的&#xff0c;这个时候就需要统一服务地址。同时也可以进行统一认证鉴权的需求。那么服…...

逻辑回归(Logistic Regression)

1.分类问题 在分类问题中&#xff0c;你要预测的变量 y是离散的值&#xff0c;我们将学习一种叫做逻辑回归 (Logistic Regression) 的算法&#xff0c;这是目前最流行使用最广泛的一种学习算法。 在分类问题中&#xff0c;我们尝试预测的是结果是否属于某一个类&#xff08;例…...

Leetcode129. 求根到叶子节点数字之和

力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 给你一个二叉树的根节点 root &#xff0c;树中每个节点都存放有一个 0 到 9 之间的数字。 每条从根节点到叶节点的路径都代表一个数字&#xff1a; 例如&#xff0c;从根节点到叶子节点的路径 1 ->…...

0401hive入门-hadoop-大数据学习.md

文章目录 1 Hive概述2 Hive部署2.1 规划2.2 安装软件 3 Hive体验4 Hive客户端4.1 HiveServer2 服务4.2 DataGrip 5 问题集5.1 Could not open client transport with JDBC Uri 结语 1 Hive概述 Apache Hive是一个开源的数据仓库查询和分析工具&#xff0c;最初由Facebook开发&…...

springboot项目打包优化,将所有第三方包单独打包至lib目录

在pom.xml中配置以下代码&#xff0c;随后使用mvnw clean package打包 <build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><!-- 主…...

使用 Ccrypt 在 Linux 中加密/解密文件

Ccrypt 是一个用于数据加密和解密的命令行工具。Ccrypt 基于 Rijndael 密码,与 AES 标准中使用的密码相同。另一方面,在 AES 标准中,使用 128 位块大小,而 ccrypt 使用 256 位块大小。Ccrypt 通常使用 .cpt 文件扩展名来表示加密文件。 它是一个轻量级的工具,该工具的安装…...

poi3.10 excel xls 设置列宽行高背景色加粗

poi excel xls格式 设置列宽行高背景色加粗HSSFWorkbook wb new HSSFWorkbook(); Sheet sheet wb.createSheet("sheet1");HSSFCellStyle style wb.createCellStyle(); style.setFillForegroundColor(IndexedColors.LIGHT_TURQUOISE.getIndex());//背景色 style.se…...

揭秘分布式文件系统大规模元数据管理机制——以Alluxio文件系统为例

作者简介&#xff1a; 辭七七&#xff0c;目前大&#xff0c;正在学习C/C&#xff0c;Java&#xff0c;Python等 作者主页&#xff1a; 七七的个人主页 文章收录专栏&#xff1a; 七七的闲谈 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496;&#x1f49…...

微信小程序onReachBottom事件使用

在微信小程序中&#xff0c;onReachBottom事件用于监听页面滚动到页面底部的时候触发的事件。当用户滑动页面到底部时&#xff0c;可以通过监听该事件来执行相应的操作。 要使用onReachBottom事件&#xff0c;需要在对应的页面或组件中定义一个函数&#xff0c;并在Page或Comp…...

数据孤岛的突破口在哪里?

国务院于2021年12月发布的《“十四五”数字经济发展规划》中提到&#xff0c;我国数字经济发展中数字鸿沟问题未得到有效解决&#xff0c;各行业应充分发挥数据要素作用&#xff0c;加强数据治理和监管工作。“数据孤岛”问题虽早已被提出&#xff0c;但至今仍然存在&#xff0…...

【送书活动】全网超50万粉丝的Linux大咖良许,出书了!

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 「推荐专栏」&#xff1a; ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄&#xff0c;vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff…...

深入浅出学Verilog--基础语法

1、简介 Verilog的语法和C语言非常类似&#xff0c;相对来说还是非常好学的。和C语言一样&#xff0c;Verilog语句也是由一连串的令牌&#xff08;Token&#xff09;组成。1个令牌必须由1个或1个以上的字符&#xff08;character&#xff09;组成&#xff0c;令牌可以是&#x…...

基于Spring、SpringMVC、Mybatis的超市管理系统

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于SSM的超市订单管理系统,java项目。 …...

spring中的@Configuration配置类和@Component

在Spring的开发工作中&#xff0c;基本都会使用配置注解&#xff0c;尤其以Component及Configuration为主&#xff0c;当然在Spring中还可以使用其他的注解来标注一个类为配置类&#xff0c;这是广义上的配置类概念&#xff0c;但是这里我们只讨论Component和Configuration&…...

企业架构LNMP学习笔记29

Nginx负载均衡配置&#xff1a; 架构分析&#xff1a; 1&#xff09;用户访问请求Nginx负载均衡服务器&#xff1b; 2&#xff09;Nginx负载均衡服务器再分发请求到Web服务器。 实际配置负载均衡&#xff0c;只需修改作为负载均衡服务器的Nginx即可&#xff0c;当前架构中的…...

Ubuntu14.04离线安装gcc-5.3.0

离线安装gcc 下载gcc安装包下载相关依赖下载gmp下载mpfr下载mpc 编译、安装gcc配置环境变量 拉取的一个虚拟机使用的系统是Ubuntu14.04&#xff0c;gcc版本是4.8.4&#xff0c;由于gcc版本较低&#xff0c;不太支持Libtorch&#xff0c;于是搜寻了许多办法来解决这个问题&#…...

axios返回几种数据格式? 其中Blob返回时的size是什么意思?

axios返回几种数据格式? 其中Blob返回时的size是什么意思&#xff1f; 1、字符串&#xff08;String&#xff09;&#xff1a;服务器可以返回纯文本或HTML内容&#xff0c;Axios会将其作为字符串返回。 2、JSON&#xff08;JavaScript Object Notation&#xff09;&#xff…...

【GO语言基础】基本数据类型

系列文章目录 【Go语言学习】ide安装与配置 【GO语言基础】前言 【GO语言基础】变量常量 【GO语言基础】数据类型 文章目录 系列文章目录数据类型数值型&#xff1a;整数类型&#xff1a;浮点数类型&#xff1a; 字符型-布尔型-字符串零值转义字符 常用类型转换运算符总结 数据…...

【Python】OpenCV立体相机配准与三角化代码实现

下面的介绍了使用python和OpenCV对两个相机进行标定、配准,同时实现人体关键点三角化的过程 import cv2 as cv import glob import numpy as np import matplotlib.pyplot as pltdef calibrate_camera(images_folder):images_names = glob.glob(images_folder...

京东自动抢购工具完整指南:5分钟学会Python自动化购物

京东自动抢购工具完整指南&#xff1a;5分钟学会Python自动化购物 【免费下载链接】autobuy-jd 使用python语言的京东平台抢购脚本 项目地址: https://gitcode.com/gh_mirrors/au/autobuy-jd 还在为京东秒杀抢不到心仪商品而烦恼吗&#xff1f;想要在促销活动中轻松抢购…...

手把手教你调试STM32F103的UART4 DMA:从CubeMX配置到逻辑分析仪抓包分析

STM32F103 UART4 DMA调试实战&#xff1a;从CubeMX配置到逻辑分析仪波形解析 在嵌入式开发中&#xff0c;UART通信是最基础也最常用的外设之一。当通信数据量大或实时性要求高时&#xff0c;直接使用中断方式处理每个字节会显著增加CPU负担。DMA&#xff08;直接内存访问&#…...

GIS国土工具实战:从地类分析到坐标转换,一站式解决项目难题

1. GIS国土工具如何解决项目痛点 第一次接触国土整治项目时&#xff0c;我被各种数据格式搞得焦头烂额。早上9点收到甲方发来的50个地块的shp文件&#xff0c;下午3点就要提交带坐标的txt报备文件&#xff0c;中间还要做地类分析和影像核对。手动操作&#xff1f;光是想到要一个…...

三维姿态表达:从欧拉角、旋转矩阵到四元数的工程实践

1. 三维姿态表达的基础概念 在三维空间中描述物体的姿态&#xff08;orientation&#xff09;是许多工程领域的核心需求&#xff0c;无论是卫星姿态控制、机器人运动规划&#xff0c;还是游戏开发中的角色动画&#xff0c;都需要精确的姿态表达方式。姿态描述的本质是回答一个问…...

实测5款AI教材编写工具,低查重效果惊人,快速生成专业教材

许多教材编写者常常感到遗憾&#xff0c;他们费尽心思完善的正文内容&#xff0c;因为缺少配套资源而导致教学效果打折。设计课后练习题时&#xff0c;面对题型的多样化却缺乏创新的思路&#xff1b;制作可视化教学课件时&#xff0c;手头的技术能力又无法满足&#xff1b;深入…...

【模块化设计-10】UART1 驱动 + 环形 FIFO 实现高效串口数据收发

在嵌入式开发中&#xff0c;串口&#xff08;UART&#xff09;是最常用的通信接口之一&#xff0c;而直接采用中断 缓冲区的方式处理串口数据&#xff0c;能有效避免数据丢失、提升收发效率。本文将基于实际项目代码&#xff0c;详解UART1 驱动与环形 FIFO&#xff08;ring_fi…...

Excel公式生成黑科技落地实录(ChatGPT+Power Query+LAMBDA三引擎联动)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Excel公式生成黑科技落地实录&#xff08;ChatGPTPower QueryLAMBDA三引擎联动&#xff09; 场景驱动的智能公式生成闭环 当财务团队需在5分钟内为127张销售报表动态生成「跨表多条件加权滚动同比」公…...

48_《智能体微服务架构企业级实战教程》智能助手主应用服务之工具决策节点

前言 配套视频教程: 在 Bilibili课堂、CSDN课程、51CTO学堂 同步发售,提供:源码+部署脚本+文档。 bilibili课堂视频教程:智能体微服务架构企业级实战教程_哔哩哔哩_bilibili CSDN课程视频教程:智能体微服务架构企业级实战教程_在线视频教程-CSDN程序员研修院 51CTO学堂…...

FCOS训练自己的数据?从Labelme标注到VOC格式转换,这份避坑指南请收好

FCOS训练自定义数据集&#xff1a;从Labelme标注到VOC格式的完整避坑指南 当你已经用Labelme完成了图像标注&#xff0c;却卡在数据格式转换这一步时&#xff0c;这篇文章将成为你的救星。FCOS作为一款优秀的全卷积目标检测模型&#xff0c;对输入数据格式有着严格的要求&#…...

OpenClaw-RUH:基于深度学习的机器人灵巧抓取框架解析与实践

1. 项目概述&#xff1a;当AI遇上“机械爪”最近在AI和机器人交叉的圈子里&#xff0c;一个名为“OpenClaw-RUH”的项目引起了我的注意。乍一看这个标题&#xff0c;你可能会觉得它又是一个开源的机械臂控制项目。但当我深入其代码仓库和社区讨论后&#xff0c;发现它的野心远不…...