破阵子(三分+凸包旋转卡壳)

Description

平面上有n个点,每个点有各自的速度向量,现在给出0时刻,在同一时刻,平面点的最远距离叫做special dis
他们每个点的位置和每个点的速度向量,现在求在哪个时刻的时候,他们的special dis 最小,并输出这个距离。

Input

输入一个正整数T(T<=10),表示有T组数据,每组数据包括一个n(n<=10000),表示有n个点,每行包括每个点的坐标 (x,y) (-100000<=x,y<=100000),速度向量 (vx,vy)  (-1000<=vx,vy<=1000)

Output

输出在哪个时刻的时候,special dis距离最小,保留两位小数

Sample Input

2
2
0 0 1 0
2 0 -1 0
4
27 27 0 2
58 88 -8 -1
-22 7 1 -1
-38 -26 5 9

Sample Output

1.00 0.00
8.89 81.00

思路:

求最大值中最小值,首先想到二分

但发现dis不一定随时间增大而增大,

事实上,两点间距离,要么直接增加,要么先减少再增加。

所以dis也是要么直接增加,要么先减少再增加。

这是一个单峰的变化。

用到三分;

其次,对于每个时间点,我们可以知道每个点坐标。

多对点的最远距离一定是在凸包上取得的(证明可以搜搜)

找到凸包之后,用旋转卡壳求取一个时间点的最远距离;

代码:

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<utility>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<math.h>
#include<map>
using namespace std;
typedef long long LL;
typedef unsigned long long ull;
#define per(i,a,b) for(int i=a;i<=b;i++)
#define ber(i,a,b) for(int i=a;i>=b;i--)
const int N = 1e4 + 5;
const LL mod = 10000000033;
double eps = 1e-8;
int top = 0, n;
struct Point
{
    double x;
    double y;
    double vx;
    double vy;
}p[N], tmp[N], s[N];
bool cmp(struct Point a, struct Point  b)
{
    if (a.x != b.x)
        return a.x < b.x;
    return a.y < b.y;
}
void  into(double t)
{
    per(i, 1, n)
    {
        tmp[i].x = p[i].x + p[i].vx * t;
        tmp[i].y = p[i].y + p[i].vy * t;
    }
    sort(tmp + 1, tmp + 1 + n, cmp);
}
double cross(struct Point& a, struct Point& b, struct Point& c)
{
    return (b.x - a.x) * (c.y - a.y) - (b.y - a.y) * (c.x - a.x);
}
void Andro(double t)
{
    top = -1;
    into(t);
    per(i, 1, n)
    {
        while (top > 0 && cross(s[top - 1], s[top], tmp[i]) <= 0) top--;
        s[++top] = tmp[i];
    }
    int tt = top;
    ber(i, n - 1, 1)
    {
        while (top > tt && cross(s[top - 1], s[top], tmp[i]) <= 0)  top--;
        s[++top] = tmp[i];
    }
}
double dis(struct Point& a, struct Point& b)
{
    return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));
}
double f(double t)
{
    Andro(t);
    if (top <= 2)
        return dis(s[0], s[1]);
    double ans = 0;
    for (int i = 0, j = 2; i < top; i++)
    {
        while (abs(cross(s[i], s[i + 1], s[j])) < abs(cross(s[i], s[i + 1], s[j + 1]))) j = (j + 1) % top;
        ans = max(ans, max(dis(s[i], s[j]), dis(s[i + 1], s[j])));
    }
    return ans;
}
double sanfen(double l, double r)
{
    double mi, ma;
    while (r - l > eps)
    {
        mi = l + (r - l) / 3;
        ma = r - (r - l) / 3;
        if (f(mi) >= f(ma)) l = mi;
        else r = ma;
    }
    return mi;
}
int main()
{
    int T;
    cin >> T;
    while (T--)
    {
        cin >> n;
        per(i, 1, n)
            cin >> p[i].x >> p[i].y >> p[i].vx >> p[i].vy;
        double t = sanfen(0, 10000);
        printf("%.2f %.2f\n", t, f(t));
    }
    return 0;
}

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

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

相关文章

postgres(pg)数据库使用建表语句创建数据表

一般创建数据表有两种方式&#xff0c;一种是使用建表语句&#xff0c;二是使用图形化工具建表&#xff08;如&#xff1a;pgadmin4、Navicat、DataGrip、dbeaver等等之类的工具&#xff09;&#xff1b; 1、使用建表语句创建数据表&#xff1a; -- 建立学生测试表语句如下&am…

Java问题和解决方案汇总

将其他类型转换成数值类型的解决方案 例&#xff1a;Integer转成Double类型 Double.parseDouble(a.toString()); 嵌套Map中&#xff0c;拿到里层Map的value(例&#xff1a;Map.get("xxx").get("xxx")) 主要的目的是为了得到第二个get&#xff0c;只要将第一…

接口测试:轻松掌握基础知识,快速提升测试技能!

1.client端和server端 开始接口测试之前&#xff0c;首先搞清楚client端与server端是什么&#xff0c;区别。 web前端&#xff0c;顾名思义&#xff0c;指用户可以直观操作和看到的界面&#xff0c;包括web页面的结构&#xff0c;web的外观视觉表现及web层面的交互实…

顶级设计师力荐的界面设计软件,设计新选择

即时设计 作为专业的在线协作UI设计软件&#xff0c;即时设计可以实现视觉效果、交互效果、体验效果一站成型&#xff0c;为你的目标用户创造流畅体验。 轻松绘制原型&#xff1a;借助社区设计资源和原型模板的即时设计&#xff0c;开始敏捷高效的工作。与产品经理分解用户需…

E. Good Triples

首先 如果产生进位的话是一定不对的&#xff0c;因为进位会给一个1&#xff0c;但是损失了10 然后可以按位直接考虑&#xff0c;转换成一个隔板法组合数问题 // Problem: E. Good Triples // Contest: Codeforces - Codeforces Round 913 (Div. 3) // URL: https://codeforces…

xShell快捷键

Xshell 是一个强大的终端仿真器&#xff0c;它支持多种Linux发行版的远程连接。Xshell提供了一系列的快捷键&#xff0c;以提高用户的操作效率。以下是一些Xshell中常用的快捷键&#xff1a; 新建会话窗口&#xff1a; Ctrl N 或 Ctrl Shift N 在现有会话中打开新标签&…

反序列化漏洞详解(二)

目录 pop链前置知识&#xff0c;魔术方法触发规则 pop构造链解释&#xff08;开始烧脑了&#xff09; 字符串逃逸基础 字符减少 字符串逃逸基础 字符增加 实例获取flag 字符串增多逃逸 字符串减少逃逸 延续反序列化漏洞(一)的内容 pop链前置知识&#xff0c;魔术方法触…

python 深度图转换为点云

一、概念 深度图是点云由3D点投影到2D平面的逆过程,其中每个像素值代表的是物体到相机xy平面的距离。深度图可以提供场景中某一点距离摄像机的远近信息。 二、python代码 import numpy as np import open3d as o3d import os# Depth Intrinsic Parameters fx_d = 7.8128789…

软件测试之python+requests接口自动化测试框架实例教程

前段时间由于公司测试方向的转型&#xff0c;由原来的web页面功能测试转变成接口测试&#xff0c;之前大多都是手工进行&#xff0c;利用postman和jmeter进行的接口测试&#xff0c;后来&#xff0c;组内有人讲原先web自动化的测试框架移驾成接口的自动化框架&#xff0c;使用的…

HTTPS安全防窃听、防冒充、防篡改三大机制原理

前言 本文内容主要对以下两篇文章内容整理过滤&#xff0c;用最直观的角度了解到HTTPS的保护机制&#xff0c;当然啦&#xff0c;如果想要深入了解HTTPS&#xff0c;本文是远远不够的&#xff0c;可以针对以下第一个链接中的文章拓展板块进行学习&#xff0c;希望大家通过本文能…

WAT、CP、FT的概念及周边名词解释

CP是把坏的Die挑出来&#xff0c;可以减少封装和测试的成本。可以更直接的知道Wafer 的良率。 FT是把坏的chip挑出来&#xff1b;检验封装的良率。 现在对于一般的wafer工艺&#xff0c;很多公司多把CP给省了&#xff0c;减少成本。 CP对整片Wafer的每个Die来测试&#xff0…

光伏系统方案设计的注意点

随着太阳能技术的日益发展&#xff0c;光伏系统已经成为一种重要的可再生能源解决方案。然而&#xff0c;设计一个高效、可靠的光伏系统需要考虑到许多因素。本文将探讨光伏系统方案设计的注意点&#xff0c;包括系统规模、地理位置、组件选择、系统布局和运维策略。 系统规模 …

C++ 模拟实现string类

目录 一、类的定义 二、初始化&销毁 1、构造函数 2、辨析三种定义 3、析构函数 三、赋值 1、拷贝构造函数 2、赋值运算符 四、成员访问 operator[ ] 五、比较大小&判断相等 六、容量操作 1、size() 2、reserve 3、push_back 4、append 5、加等运算符…

onnx检测推理

起因&#xff1a;当我想把检测的onnx模型转换到特定的设备可以使用的模型时&#xff0c;报错do not support dimension size > 4&#xff0c;onnx中有些数据的维度是五维&#xff0c;如图。本文使用的是edgeyolo&#xff0c;它使用的是yolox的head&#xff0c;最后的输出加上…

gmid方法设计五管OTA二级远放

首先给出第一级是OTA&#xff0c;第二级是CS的二级运放电路图&#xff1a; gmid的设计方法可以根据GBW、Av、CL来进行电路设计&#xff0c;因此在设计电路之前需要以上的参数要求。 1、为了满足电路的相位裕度至少60&#xff0c;需要对GBW、主极点、零点进行分析。 首先给出其…

应用程序无法找到xinput1_3.dll怎么办,xinput1_3.dll 丢失的解决方法

当电脑系统或特定应用程序无法找到或访问到 xinput1_3.dll 文件时&#xff0c;便会导致错误消息的出现&#xff0c;例如“找不到 xinput1_3.dll”、“xinput1_3.dll 丢失”等。这篇文章将大家讨论关于 xinput1_3.dll 文件的内容、xinput1_3.dll丢失问题的解决方法&#xff0c;以…

查收查引(通过文献检索开具论文收录或引用的检索证明)

开具论文收录证明的 专业术语为 查收查引&#xff0c;是高校图书馆、情报机构或信息服务机构提供的一项有偿服务。 因检索需要一定的时间&#xff0c;提交委托时请预留足够的检索时间。 一般需要提供&#xff1a;论文题目、作者、期刊名称、发表年代、卷期、页码。 目录 一、查…

MIT6.5840-2023-Lab1: MapReduce

前置知识 MapReduce&#xff1a;Master 将一个 Map 任务或 Reduce 任务分配给一个空闲的 worker。 Map阶段&#xff1a;被分配了 map 任务的 worker 程序读取相关的输入数据片段&#xff0c;生成并输出中间 k/v 对&#xff0c;并缓存在内存中。 Reduce阶段&#xff1a;所有 ma…

QT 中基于 TCP 的网络通信 (备查)

基础 基于 TCP 的套接字通信需要用到两个类&#xff1a; 1&#xff09;QTcpServer&#xff1a;服务器类&#xff0c;用于监听客户端连接以及和客户端建立连接。 2&#xff09;QTcpSocket&#xff1a;通信的套接字类&#xff0c;客户端、服务器端都需要使用。 这两个套接字通信类…

位运算在查找重复元素中的妙用

关卡名 用4KB内存寻找重复元素 我会了✔️ 内容 1.理解如何用4KB内存寻找重复元素 ✔️ 本关所有题目的重点都是理解如何解决就好&#xff0c;面试问的时候能够将问题描述清楚&#xff0c;不用写代码。 在海量数据中&#xff0c;此时普通的数组、链表、Hash、树等等结构有…