P9568 [SDCPC2023] Computational Geometry 题解

P9568 [SDCPC2023] Computational Geometry 题解

感谢战学长的帮助。

解法

本题的关键是将多边形 Q Q Q 分割为两部分,一部分是由点 a , b , c a,b,c a,b,c 组成的三角形,另一部分是由从 b b b c c c k + 1 k + 1 k+1 个点组成的凸多边形。注意到这种由 k + 1 k + 1 k+1 个点组成的凸多边形的数量是有限的,为 n n n 个,而由点 a , b , c a,b,c a,b,c 组成的三角形的数量更多,所以我们考虑固定 k + 1 k + 1 k+1 个点的多边形,即固定点 b , c b,c b,c,然后查找可以使三角形 a , b , c a,b,c a,b,c 面积最大的点 a a a,即点 a a a 到直线 b c bc bc 的垂直距离最大。

考虑所有可被选择为点 a a a 的点,它们和直线 b c bc bc 的距离是一个单峰函数,故可以考虑使用三分法求得函数峰值。

现在我们想到了一个做法:用 O ( n + k ) \mathcal{O}(n + k) O(n+k) 的时间复杂度预处理所有 k + 1 k + 1 k+1 个点的多边形的面积,用 O ( n log ⁡ n ) \mathcal{O}(n \log n) O(nlogn) 的时间复杂度求得点 a a a

预处理多边形面积的方法:先选定一个多边形,将其暴力地拆成 k − 1 k-1 k1 个三角形,对每个三角形叉积求面积,值得注意的是叉积的模长是平四的有向面积,所以这里求面积时应对叉积的模长取绝对值。这里有个小 t r i c k trick trick,就是在计算过程中我们不将面积除以 2 2 2,而是在最后输出时除以 2 2 2,防止计算过程中有浮点数的出现。

然后考虑递推转移,如图,目标状态的面积为原有状态的面积加上红色三角形面积减去绿色三角形面积。

图

这时战学长给我发了个 h i n t hint hint,说有严格线性做法。仔细考虑当线段 b c bc bc 逆时针变化时, a a a 点也是逆时针变化的。所以 a a a 点的移动是有单调性的,移动次数不超过 n n n 次,因此可以每次旋转线段 b c bc bc 时暴力地移动点 a a a

时间复杂度 O ( n + k ) \mathcal{O}(n + k) O(n+k)

代码

#include<bits/stdc++.h>
namespace fast_IO
{
	/**
	 * 顾名思义,是快读快写。
	*/
};
using namespace fast_IO;
#define int long long
// considering the issue of accuracy,we can twice the storage surface
int t,n,k,surf[100010],pt,b,c,pres,nxts,ans;
struct point
{
	int x,y;
	inline point(int x=0,int y=0)
	{
		this->x=x,this->y=y;
	}
	inline point operator-(const point &rhs) const
	{
		return point(x-rhs.x,y-rhs.y);
	}
	inline int operator*(const point &rhs)
	{
		return x*rhs.y-y*rhs.x;
	}
};
point a[100010];
inline int calc(const point x,const point y,const point z) // calculate the surface of the triangle we chose
{
	return abs((y-x)*(z-x));
}
signed main()
{
	in>>t;
	while(t--)
	{
		in>>n>>k,ans=0;
		for(int i=1;i<=n;i++) in>>a[i].x>>a[i].y,surf[i]=0;
		b=1,c=k+1,pt=c,pres=0;
		for(int i=2;i<=k;i++) surf[b]+=calc(a[i-1],a[i],a[c]);
		for(int i=2;i<=n;i++)
			surf[i]=
			surf[i-1]+
			calc(a[i+k-1>n?i+k-1-n:i+k-1],a[i+k>n?i+k-n:i+k],a[i])-
			calc(a[i-1],a[i+k-1>n?i+k-1-n:i+k-1],a[i]);
		for(;b<=n;b++,c=b+k>n?b+k-n:b+k)
		{
			pres=calc(a[b],a[c],a[pt]);
			while(pt!=b)
			{
				nxts=calc(a[b],a[c],a[pt+1>n?pt+1-n:pt+1]);
				if(nxts>pres) pres=nxts,pt=pt+1>n?pt+1-n:pt+1;
				else break;
			}
			ans=std::max(ans,surf[b]+pres);
			if(pt==c) pt=pt+1>n?pt+1-n:pt+1;
		}
		out<<ans/2.0<<'\n';
	}
	fwrite(Ouf,1,p3-Ouf,stdout),fflush(stdout);
	return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

回归问题波士顿房价预测

线性回归API sklearn.linear_model.LinearRegression(fit_interceptTrue) 正规方程优化参数&#xff1a;fit_intercept&#xff0c;是否计算偏置属性&#xff1a;LinearRegression.coef_ &#xff08;回归系数&#xff09; LinearRegression.intercept_&#xff08;偏置&…

2024.1.23 GNSS 零散知识 学习笔记

1.天线种类 2.接收机 2.四大导航系统的介绍 3.卫星高度与轨道卫星种类 4.GNSS有哪些应用 5.在空间保持静⽌或匀速直线运动(⽆加速度)的坐标系称为惯性坐标系。 6.地⼼惯性坐标系实际上并没有满⾜能成为惯性坐标系的条件&#xff1a; ⾸先&#xff0c;地球及其质⼼都在围绕太阳…

《WebKit 技术内幕》学习之九(2): JavaScript引擎

2 V8引擎 2.1 基础 V8是一个开源项目&#xff0c;也是一个JavaScript引擎的实现。它最开始是由一些语言方面的专家设计出来的&#xff0c;后被Google收购&#xff0c;成为了JavaScript引擎和众多相关技术的引领者。其目的很简单&#xff0c;就是为了提高性能。因为在当时之前…

C++比较两个proto是否一样

参考:https://stackoverflow.com/questions/3228107/google-protocol-buffers-compare/32351914#32351914 #include <google/protobuf/util/message_differencer.h>MessageDifferencer::Equals(msg1, msg2);

dhcp服务器的ip池的待分配ip地址是否冲突的检测机制

看到有的资料说&#xff0c;dhcp服务器在分配ip地址时&#xff0c;要检测是否待分配的ip地址是否存在冲突&#xff0c;会向广播域发出&#xff0c;对应ip发出icmp的ping消息来验证是否冲突。特地用自己的公司的交换机验证一下&#xff0c;在交换机上镜像抓包观察一下。 wiresha…

【C++】位图+布隆过滤器

位图布隆过滤器 1.位图2.布隆过滤器 喜欢的点赞&#xff0c;收藏&#xff0c;关注一下把&#xff01; 1.位图 问: 给40亿个不重复的无符号整数&#xff0c;没排过序。给一个无符号整数&#xff0c;如何快速判断一个数是否在这40亿个数中。 可能你会想到下面这几种方式&#…

【Python进阶编程】python编程高手常用的设计模式(持续更新中)

Python编程高手通常熟练运用各种设计模式&#xff0c;这些设计模式有助于提高代码的可维护性、可扩展性和重用性。 以下是一些Python编程高手常用的设计模式&#xff1a; 1.单例模式&#xff08;Singleton Pattern&#xff09; 确保一个类只有一个实例&#xff0c;并提供全局…

softmax回归实战-分类

1.数据集 MNIST数据集 (LeCun et al., 1998) 是图像分类中广泛使用的数据集之一&#xff0c;但作为基准数据集过于简单。 我们将使用类似但更复杂的Fashion-MNIST数据集 (Xiao et al., 2017)。 import torch import torchvision from torch.utils import data from torchvisi…

javaspringbootmysql开放实验室管理系统03361-计算机毕业设计项目选题推荐(附源码)

摘 要 随着社会的发展&#xff0c;社会的方方面面都在利用信息化时代的优势。互联网的优势和普及使得各种系统的开发成为必需。 本文以实际运用为开发背景&#xff0c;运用软件工程原理和开发方法&#xff0c;它主要是使用动态网页开发技术java作为系统的开发语言&#xff0c;M…

如何把openwrt的ipk软件包安装到ubuntu上

前提&#xff1a;都是arm64的架构的软件包。 下载openwrt的ipk软件包 1. 从https://pkgs.org/ 查找下载软件包&#xff1a; 本文以swconfig软件包为例&#xff0c;下载swconfig和相关的依赖软件包&#xff1a; swconfig_12_aarch64_cortex-a72.ipk libuci20130104_2021-10-2…

eNSP学习——交换机基础

目录 原理概述 实验目的 实验步骤 实验内容 实验拓扑 实验步骤 基础配置 配置交换机双工模式 配置接口速率 思考题 原理概述 交换机之间通过以太网电接口对接时需要协商一些接口参数&#xff0c;比如速率、双工模式等。   接口速率&#xff1a;指的是交换机接口每秒钟传…

【操作系统】实验五 添加内核模块

&#x1f57a;作者&#xff1a; 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1f3c7;码字不易&#xff0c;你的&#x1f44d;点赞&#x1f64c;收藏❤️关注对我真的很重要&…

apkpure下载Google Play中APP的APK安装包

比如Google Play上有个应用叫iSmart DV&#xff0c;想下载APK&#xff0c;怎么做呢 打开apkpure(https://apkpure.net/)&#xff0c;输入对应的app名称即可下载

Making Large Language Models Perform Better in Knowledge Graph Completion论文阅读

文章目录 摘要1.问题的提出引出当前研究的不足与问题KGC方法LLM幻觉现象解决方案 2.数据集和模型构建数据集模型方法基线方法任务模型方法基于LLM的KGC的知识前缀适配器知识前缀适配器 与其他结构信息引入方法对比 3.实验结果与分析结果分析&#xff1a;可移植性实验&#xff1…

Kafka-服务端-KafkaController

Broker能够处理来自KafkaController的LeaderAndIsrRequest、StopReplicaRequest、UpdateMetadataRequest等请求。 在Kafka集群的多个Broker中&#xff0c;有一个Broker会被选举为Controller Leader,负责管理整个集群中所有的分区和副本的状态。 例如&#xff1a;当某分区的Le…

第92讲:MySQL主从复制集群故障排查思路汇总

文章目录 1.从库I/O线程处于Connecting状态2.从库I/O线程处于No状态3.从库SQL线程处于No状态 1.从库I/O线程处于Connecting状态 从库的I/O线程处于Connection连接中的状态&#xff0c;一般都是连接不上主库导致&#xff1a; 可能由于网络不通&#xff0c;防火墙的干扰导致从库…

MongoDB系列之一文总结索引

概述 分类 索引的分类&#xff1a; 按照索引包含的字段数量&#xff0c;可分为单键索引&#xff08;单字段索引&#xff09;和组合索引&#xff08;联合索引、复合索引&#xff09;按照索引字段的类型&#xff0c;可以分为主键索引和非主键索引按照索引节点与物理记录的对应…

2024免费mathtype7.4.4安装注册步骤教程

数学建模中对公式的编辑有很高的要求&#xff0c;mathtype是一款专业的数学公式编辑工具&#xff0c;能够帮助用户在各种文档中插入复杂的数学公式和符号。 一 Mathtype 的下载安装 1.1 安装前须知 解压和安装前&#xff0c;需要将电脑的杀毒软件或者防火墙关掉&#xff0c;如…

python222网站实战(SpringBoot+SpringSecurity+MybatisPlus+thymeleaf+layui)-后台管理主页面实现

锋哥原创的SpringbootLayui python222网站实战&#xff1a; python222网站实战课程视频教程&#xff08;SpringBootPython爬虫实战&#xff09; ( 火爆连载更新中... )_哔哩哔哩_bilibilipython222网站实战课程视频教程&#xff08;SpringBootPython爬虫实战&#xff09; ( 火…

vue3跨域请求及一些常用配置

在使用vue3开发的时候&#xff0c;总免不了做一些基础的配置。比如跨域配置&#xff0c;一些常用函数的封装等等。接下来&#xff0c;我就做一些自己在在开发中所运用到一些常用配置。 一、跨域配置 其实&#xff0c;对于跨域配置&#xff0c;我之前的博文中也有说过&#xff0…