题解:CF1019D Large Triangle

题意

给定 n n n 个平面上的点,求是否存在 3 3 3 个点使得它们组成的三角形面积为 S S S。需要输出三个点的坐标。

n ≤ 2000 n\le2000 n2000

解法

暴力做法:枚举 3 3 3 个点,海伦公式判断面积是否相等。复杂度 O ( n 3 ) O(n^3) O(n3)。优化思路即为:对于先枚举的两个点 A , B A,B A,B 组成的连线 l l l,那么第 3 3 3 个点 C C C 就要满足其到这条连线的距离为 2 m ∣ l ∣ \cfrac{2m}{|l|} l2m。如果其余点与 l l l 的距离有序,那么就可以 O ( log ⁡ n ) O(\log n) O(logn) 的复杂度二分了,分成在 l l l 之上、之下两个部分。

考虑将所有点进行旋转,使 l l l y y y 轴重合。这时候可以发现一个性质:

  • l l l 为纵轴时,对于任意两个点 X , Y X,Y X,Y,它们的横坐标大小关系,只与原图中 l l l A B AB AB 的斜率有关。

然后做法就出来了:先把 n 2 n^2 n2 条连线按照斜率从小到大排序,然后从小到大枚举,这样任意两点旋转后的横坐标大小关系恰好会变化一次。枚举连线的过程中每次交换两个端点,再在连线的两侧(正负)进行查找即可。

代码

#include <bits/stdc++.h>
using namespace std;
const int maxn = 2005;
#define ll long long
int n, a[maxn + 5];
ll m;
struct Point { int id, x, y;
} p[maxn + 5];
struct Segment {int x, y;double k;bool operator< (const Segment &o) const { // 按照斜率return k < o.k; }
} sid[maxn * maxn + 5];
bool cmp(const Point &A, const Point &B) { return A.x < B.x; 
}
ll cal(const Point &u,const Point &v,const Point &w) { // 算出第 3 条边的长度return abs(1ll * (u.x - v.x) * (u.y - w.y) - 1ll * (u.x - w.x) * (u.y - v.y));
}
bool ok = false;
// 对于 l 进行左右两侧的二分。
void F1(int l, int r, const Point &A, const Point &B) {  while (l <= r) {int mid = l + r >> 1; ll S = cal(p[mid], A, B);if (S == 2 * m) {printf("Yes\n%d %d\n%d %d\n%d %d\n", A.x, A.y, B.x, B.y, p[mid].x, p[mid].y);ok = true; return ;} else if (S < 2 * m) r = mid - 1;else l = mid + 1;}
}
void F2(int l, int r, const Point &A, const Point &B) {while(l <= r) {int mid = l + r >> 1; ll S = cal(p[mid], A, B);if (S == 2 * m) {printf("Yes\n%d %d\n%d %d\n%d %d\n", A.x, A.y, B.x, B.y, p[mid].x, p[mid].y); ok = true; return ;} else if (S < 2 * m) l = mid + 1;else r = mid - 1;}
}
int tot = 0;
int main() {scanf("%d%lld", &n, &m);for (int i = 1; i <= n; i ++)scanf("%d%d", &p[i].x, &p[i].y);sort(p + 1, p + n + 1, cmp);for (int i = 1; i <= n; i ++)a[i] = p[i].id = i;for (int i = 1; i <= n; i ++)for (int j = i + 1; j <= n; ++j)sid[++ tot] = Segment{i, j, 1.0 * (p[j].y - p[i].y) / (p[j].x - p[i].x)};sort(sid + 1, sid + tot + 1); for (int i = 1; i <= tot; i ++) {int mn = min(a[sid[i].x], a[sid[i].y]);int mx = max(a[sid[i].x], a[sid[i].y]); swap(p[mn], p[mx]); swap(a[sid[i].x], a[sid[i].y]);F1(1, mn - 1, p[a[sid[i].x]], p[a[sid[i].y]]);if (ok) return 0;F2(mx + 1, n, p[a[sid[i].x]], p[a[sid[i].y]]);if (ok) return 0;}return puts("No"), 0;
}

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

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

相关文章

C++ 编程技巧分享

侯捷 C 学习路径&#xff1a;面向对象的高级编程 -> STL库 -> C11新特性 -> cmake 1.1. C 与 C的区别 在C语言中&#xff0c;主要存在两大类内容&#xff0c;数据和处理数据的函数&#xff0c;二者彼此分离&#xff0c;是多对多的关系。不同的函数可以调用同一个数据…

小i机器人:总负债5.31亿,员工数量在减少,银行借款在增加,净利润已下降-362.68%

小i机器人:总负债5.31亿,员工数量在减少,银行借款在增加,总收入在增长,净利润已下降-362.68% 来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 目录 一、小i机器人公司介绍 二、小i机器人过去20年的发展历程和取得的成就 三、小i机器人的产品和技术架构 四、小i机器人…

066、Python 关于Lambda函数

Lambda函数是一种小型、匿名的函数&#xff0c;也称为匿名函数。它们可以在代码中用作一次性的、简单的函数。lambda函数可以接受任意数量的参数&#xff0c;但只能包含一个表达式。lambda函数的语法比较简洁&#xff0c;通常用于需要一个简单函数的地方&#xff0c;而不需要为…

[最新教程]Claude Sonnet 3.5注册方法详细步骤分享,新手小白收藏,文末免费送已注册的Claude账号

一.Claude sonnet 3.5大模型面世 6月21日&#xff0c;被称为“OpenAI 最强竞对”的大模型公司 Anthropic 发布了 Claude 3.5 系列模型中的第一个版本——Claude 3.5 Sonnet。 Anthropic 在官方博客中表示&#xff0c;Claude 3.5 Sonnet 提高了智能化的行业标准&#xff0c;在…

数据分析的数学概念

众数-数据集中趋势 众数&#xff08;Mode&#xff09;是指在一组数据中出现次数最多的数值&#xff0c;它是描述数据集中趋势的一种方法&#xff0c;众数并不一定代表数据的一般水平。众数可以是数据集中的一个值&#xff0c;也可以是多个值&#xff0c;这取决于数据集的分布情…

基于卷积神经网络的目标检测

卷积神经网络基础知识 1.什么是filter 通常一个6x6的灰度图像&#xff0c;构造一个3*3的矩阵&#xff0c;在卷积神经网络中称之为filter,对&#xff16;x6的图像进行卷积运算。 2.什么是padding 假设输出图像大小为nn与过滤器大小为ff&#xff0c;输出图像大小则为(n−f1)∗(…

如何优化React应用的性能?

优化React应用的性能是一个多方面的过程&#xff0c;涉及到代码的编写、组件的设计、资源的管理等多个层面。以下是一些常见的性能优化策略&#xff1a; 避免不必要的渲染: 使用React.memo、useMemo和useCallback来避免组件或其子组件不必要的重新渲染。 代码分割: 使用React.…

【计算机毕业设计】204基于微信小程序疫情期间学生请假与销假系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

DDei在线设计器-API-DDeiFile

DDeiFile DDeiFile是代表一个设计文件&#xff0c;一个文件含有多个DDeiSheet(页签)。   DDeiFile实例包含了一个文件的所有数据&#xff0c;在获取后可以通过它访问其他内容。DDeiEditor中的files属性记录了当前打开的文件列表。 一个DDeiEditor实例至少包含一个DDeiFile实例…

同一天里,两位大厂程序员猝死。。。

2024年&#xff0c;真的不是平静的一年。在几天前&#xff0c;IT行业接连发生了两件不幸的事情。 6月17日下午&#xff0c;东南亚电商公司Sh**ee位于北京的研发中心&#xff0c;一位负责研发的女员工突然在工位上晕倒。 同事们赶紧拨打了120&#xff0c;然而还是没能抢救过来&a…

Go 使用sync.Mutex或sync.RWMutex进行并发安全访问

一、使用sync.Mutex或sync.RWMutex进行并发安全访问 当多个协程并发访问共享数据时&#xff0c;需要确保数据访问的安全性。sync.Mutex和sync.RWMutex提供了互斥锁和读写锁&#xff0c;用于在访问共享资源之前进行锁定&#xff0c;以避免数据竞争。 sync.Mutex package main…

谈【AI在创造还是在毁掉音乐】

AI在创造音乐方面确实具有极大的潜力&#xff0c;但从长远来看&#xff0c;它更有可能毁掉音乐。 首先&#xff0c;AI生成的音乐缺乏情感和灵感。音乐是一种表达情感和思想的艺术形式&#xff0c;而AI只是通过算法分析和模仿已有的音乐来生成新的作品。它缺乏创造力和独特性&a…

【验证码识别】Yolov8实战某验3空间推理点选验证码,目标检测,语义分割,颜色分类。

【验证码识别】Yolov8实战某验3空间推理点选验证码&#xff0c;目标检测&#xff0c;语义分割&#xff0c;颜色分类。 文章目录 【验证码识别】Yolov8实战某验3空间推理点选验证码&#xff0c;目标检测&#xff0c;语义分割&#xff0c;颜色分类。声明1.空间推理验证码&#xf…

2024年全国青少信息素养大赛python编程复赛集训第四天编程题分享

整理资料不容易,感谢各位大佬给个点赞和分享吧,谢谢 大家如果不想阅读前边的比赛内容介绍,可以直接跳过:拉到底部看集训题目 (一)比赛内容: 【小学组】 1.了解输入与输出的概念,掌握使用基本输入输出和简单运算 为主的标准函数; 2.掌握注释的方法; 3.掌握基本数…

Studying-代码随想录训练营day17| 654.最大二叉树、617合并二叉树、700.二叉搜索树中的搜索、98.验证二叉树搜索树

第十七天&#xff0c;二叉树part05&#xff0c;进一步学习二叉树&#x1f4aa; 654.最大二叉树 文档讲解&#xff1a;代码随想录最大二叉树 视频讲解&#xff1a;手撕最大二叉树 题目&#xff1a; 学习&#xff1a;本题与利用中序和后序序列构造二叉树有相同之处。依据题目要求…

第五篇:构建与维护私有Docker Registry: 企业级实践指南

构建与维护私有Docker Registry: 企业级实践指南 1. 引言&#xff1a;解析私有Docker仓库的必要性 1.1 Docker Registry简介与私有化的好处 Docker Registry是一个用于存储和分发Docker镜像的系统。在Docker生态系统中&#xff0c;Registry扮演着至关重要的角色&#xff0c;为…

洛谷:P5714 【深基3.例7】肥胖问题

1. 题目链接 https://www.luogu.com.cn/problem/P5714 P5714 【深基3.例7】肥胖问题 2. 题目描述 题目描述&#xff1a;BMI计算:m / (h * h)&#xff0c;m是体重(kg)&#xff0c;h是身高(m) 小于18.5&#xff1a;体重国轻&#xff0c;Underweight 小于等于18.5且小于24&#…

骨传导耳机值不值得入手?五款运动好物骨传导耳机推荐!

开放式耳机在如今社会中已经迅速成为大家购买耳机的新趋势&#xff0c;开放式蓝牙耳机作为骨传导耳机&#xff0c;深受喜欢听歌和热爱运动的人群欢迎。当大家谈到佩戴的稳固性时&#xff0c;后挂式骨传导耳机都会收到一致好评。对于热爱运动的人士而言&#xff0c;高品质的骨传…

A800显卡驱动安装(使用deb安装)

重新安装显卡驱动&#xff0c;查阅了资料将过程记录如下&#xff1a; 1.下载deb安装包 打开nvidia官网查找对应的驱动版本&#xff0c;A800所在的选项卡位置如图&#xff1a; 点击查找后下载得到的是nvidia-driver-local-repo-ubuntu2004-550.90.07_1.0-1_amd64.deb安装包 2.…

从零到一学FFmpeg:avcodec_open2 函数详析与实战

文章目录 前言一、函数原型二、功能描述三、使用实例 前言 avcodec_open2是FFmpeg库中的一个关键函数&#xff0c;用于根据给定的AVCodecContext和AVCodec实例初始化编解码器&#xff0c;使其准备好进行编解码操作。 这个函数是编解码流程中配置编解码器上下文后的重要一步&am…