P6818 [PA2013]Działka 题解

P6818 [PA2013]Działka

前言

我太菜了。。。。

对着 jiangly 大佬的题解研究了一下午研究了一下午才搞出来(泪目。

作为一个蒟蒻,我就详细的讲一下我对与本题的理解。

题意

本题的的题意描述的还是比较明了。

在二维坐标系中,输入 \(n\) 个点 \(m\) 次询问,

每次询问,给出一个矩阵,

求出矩阵内极大凸包的面积。

题解

1.如何求面积

二维平面的计算几何题,较常见的做法就是利用叉积。本题亦如此。

叉积有个优美的性质,我们可以发现对于 \(\vec{a} \times \vec{b}\) 可以在二维平面赋予特殊意义( \(S\) 为三角形面积)。

\(\vec{a} \times \vec{b} = 2S\)

利用这个性质我们就可以求出任意凸包的面积。

举个例子,\(4\) 个点坐标为 \((1 , 1) (1 , 3) (3 , 3) (3 , 1)\) 在此记为 \(0\) 号点到 \(3\) 号点,\(G\) 记为原点,

那要求出其凸包的面积就可以写作:

\({ \vec{G0} \times \vec{G3} + \vec{G3} \times \vec{G2} + \vec{G1} \times \vec{G0} + \vec{G1} \times \vec{G0} \over 2}\)

P6818 [PA2013]Działka 题解

其实就可以理解为绿色的三角形相加。

P6818 [PA2013]Działka 题解

再容斥一下减去红色三角(由于叉乘的顺寻原因出来的红色三角形负数)。

P6818 [PA2013]Działka 题解

剩下的就是索要求的凸包面积。

因为本题 \(n \le 3000\) 我们可以考虑直接 \(O(n ^ 2)\) 预处理出每两个向量的叉乘(其实不是任意两个的叉乘,详见第三部分)。

呢么下面的任务就是快速找到凸包外面的点。


2.如何找凸包

如何找凸包呢?有一个十分优雅的方法。可以考虑寻找类似于四分之一扇形的凸包,然后每次旋转找到 \(4\) 个半圆再求和。假设我们先找右上角的扇形。

对于如下图形如何优美的找到凸包呢?

P6818 [PA2013]Działka 题解

我们可以考虑将点以优先 \(x\) 从大到小后 \(y\) 从大到小的顺序找(过程可以顺便预处理前面提到的任意两点的距离)。

手模一下发现,我们先会从 \(1\) 号点就可以轻易的找到 \({1 , 3 , 4}\) 的点集。

呢如何记录高效的记录答案呢?


3.如何记录答案

直接枚举每个问题,显然会 T 飞。

考虑在记录两点间距离的时候直接记录最外面凸包的距离,例如前面的图片,在记录 \(\vec{1} \times \vec{4}\) 的时可以直接记录为 \(\vec{1} \times \vec{3} + \vec{3} \times \vec{4}\)。样我们在统计答案的时候实际上只需要记录只需要记录他最接近边界的两个点就可了。

考虑每一次记录答考虑使用线段树加扫描线的思想,如下图为每个点。

P6818 [PA2013]Działka 题解

当我们更新完最外面的橙色的点还没有处理蓝色的点的时候,考虑有哪些区间里的提问是可以被更新的。

P6818 [PA2013]Działka 题解

黄色的区间是可以被更新的,利用扫描线的思想做到 \(O(m \log m)\) 维护每个图形的边界。


\(\bullet\) 加强版

模拟赛出了这道题的加强版,若坐标的范围改成 \(-10^7 \le x ,y \le 10^7\)

两个办法,一是使用效率更高的 zkw 线段树,二是数据离散化。

当然本题用普通线段树就可以切了。

Code

代码跟 jiangly 大佬的没有本质区别,就不粘了(doge去翻上一篇题解吧。

原文链接:https://www.cnblogs.com/xztx666/p/17363914.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:P6818 [PA2013]Działka 题解 - Python技术站

(0)
上一篇 2023年4月30日
下一篇 2023年4月30日

相关文章

  • 【Visual Leak Detector】配置项 SkipHeapFreeLeaks

    说明 使用 VLD 内存泄漏检测工具辅助开发时整理的学习笔记。本篇介绍 VLD 配置文件中配置项 SkipHeapFreeLeaks 的使用方法。同系列文章目录可见 《内存泄漏检测工具》目录 目录 说明 1. 配置文件使用说明 2. 设置是否跳过堆内存泄漏检测 2.1 测试代码 2.2 SkipHeapFreeLeaks = no 时的输出 2.3 Skip…

    C++ 2023年4月18日
    00
  • 【Visual Leak Detector】在 VS 2015 中使用 VLD

    说明 使用 VLD 内存泄漏检测工具辅助开发时整理的学习笔记。本篇介绍在 VS 2015 中使用 VLD。同系列文章目录可见 《内存泄漏检测工具》目录 目录 说明 1. 使用前的准备 3. 在 VS 2015 中使用 VLD 3.1 无内存泄漏时的输出报告 3.2 有内存泄漏时的输出报告 4. 无法正常使用的可能原因 1. 使用前的准备 参考本人另一篇博客 …

    C++ 2023年4月17日
    00
  • 【Visual Leak Detector】VS 中 VLD 输出解析

    说明 使用 VLD 内存泄漏检测工具辅助开发时整理的学习笔记。同系列文章目录可见 《内存泄漏检测工具》目录 目录 说明 1. 使用方式 2. 输出报告 1. 使用方式 在 VS 中使用 VLD 的方法可以查看另外一篇博客:在 VS 2015 中使用 VLD。 2. 输出报告 在 VS 中使用 VLD 时的输出报告,与在 QT 中使用时是一致的,输出内容的解析…

    C++ 2023年4月17日
    00
  • C语言跳转浏览器打开指定URL

    #include <stdlib.h> int main() { // 定义要打开的URL char* url = “https://rjku.gitee.io/”; // 调用系统命令以默认浏览器打开URL char command[100]; sprintf(command, “open %s”, url); system(command);…

    C++ 2023年4月27日
    00
  • 网络框架重构之路plain2.0(c++23 without module) 环境

    接下来本来就直接打算分享框架重构的具体环节,但重构的代码其实并没有完成太多,许多的实现细节在我心中还没有形成一个定型。由于最近回归岗位后,新的开发环境需要自己搭建,搭建的时间来说花了我整整一天的时间才勉强搞定。人们常说工欲善其事必先利其器,开发环境和工具是必不可少的,否则你会发现在接下来的过程中遇到困难的时候就会走很多弯路。虽然最后我们仍旧达到了目的,但是我…

    C++ 2023年4月17日
    00
  • 【Visual Leak Detector】库的 22 个 API 使用说明

    说明 使用 VLD 内存泄漏检测工具辅助开发时整理的学习笔记。本篇主要介绍 VLD 库提供的 22 个外部接口。同系列文章目录可见 《内存泄漏检测工具》目录 目录 说明 1. 头文件简介 2. 文件 vld_def.h 简介 3. 文件 vld.h 简介 3.1 接口 VLDDisable 3.2 接口 VLDEnable 3.3 接口 VLDRestore…

    C++ 2023年4月17日
    00
  • C++ 测试框架 GoogleTest 初学者入门篇 丙

    theme: channing-cyan *以下内容为本人的学习笔记,如需要转载,请声明原文链接 微信公众号「ENG八戒」https://mp.weixin.qq.com/s/RIztusI3uKRnoHVf0sloeg 开发者虽然主要负责工程里的开发任务,但是每个开发完毕的功能都是需要开发者自测通过的,所以经常会听到开发者提起单元测试的话题。那么今天我就带…

    C++ 2023年4月17日
    00
  • 如何将 Spire.Doc for C++ 集成到 C++ 程序中

    Spire.Doc for C++ 是一个专业的 Word 库,供开发人员在任何类型的 C++ 应用程序中阅读、创建、编辑、比较和转换 Word 文档。 本文演示了如何以两种不同的方式将 Spire.Doc for C++ 集成到您的 C++ 应用程序中。 通过 NuGet 安装 Spire.Doc for C++ 通过手动导入库安装 Spire.Doc f…

    C++ 2023年4月27日
    00
合作推广
合作推广
分享本页
返回顶部