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】VS 中 VLD 输出解析

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

    C++ 2023年4月17日
    00
  • 【Visual Leak Detector】核心源码剖析(VLD 2.5.1)

    说明 使用 VLD 内存泄漏检测工具辅助开发时整理的学习笔记。本篇对 VLD 2.5.1 源码做内存泄漏检测的思路进行剖析。同系列文章目录可见 《内存泄漏检测工具》目录 目录 说明 1. 源码获取 2. 源码文件概览 3. 源码剖析 3.1 通过 inline hook 修补 LdrpCallInitRoutine 3.2 通过 IAT hook 替换内存操…

    C++ 2023年5月11日
    00
  • luogu_P1040 [NOIP2003 提高组] 加分二叉树

    P1040 [NOIP2003 提高组] 加分二叉树 – 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意:给你一颗中序遍历为1到n的二叉树,和每个节点的val。树的值=左子树的值×右子树的值+根的val,空树值为1,求整个树最大值和这个值树的前序遍历。 题解:区间dp。dp[l][r]表示最大值,root[l][r]表示最大值的根,枚举区…

    C++ 2023年4月27日
    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
  • 如何将 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
  • 记一次 腾讯会议 的意外崩溃分析

    一:背景 1. 讲故事 前段时间在用 腾讯会议 直播的时候,居然意外崩溃了,还好不是在训练营上课,不然又得重录了,崩完之后发现 腾讯会议 的 bugreport 组件会自动生成一个 minidump,截图如下: 作为一个.NET高级调试的技术博主,非 .NET 的程序也得要研究研究哈???,有了这个好奇心,也有了这个 dump,接下来用 windbg 看一看…

    C++ 2023年4月22日
    00
  • 网络流的C++代码实现与过程讲解

    网络流是一种非常重要的图论算法,它在许多实际问题中得到广泛应用。本文将介绍网络流算法的C++代码实现与过程讲解。 算法概述 网络流算法是通过将图中的边看作流量通道,将图的点看作流量的起点或终点,来求解图中的最大或最小流量的问题。它是一种非常重要的最优化算法,广泛应用于图论、运筹学、计算机网络等领域。 网络流算法有很多种,其中最著名的是Ford-Fulkers…

    C++ 2023年4月22日
    00
  • day3 函数的定义和调用,练习编写简单的程序(记录1)

    一、函数的定义 可以分为以下两种: 1、函数声明和函数定义分离 这种方法将函数声明和函数定义分开,通常在头文件中先声明函数原型,然后在源文件中实现函数定义。 例如,头文件 example.h 中声明了一个函数 add: #ifndef EXAMPLE_H #define EXAMPLE_H int add(int a, int b); // 声明函数原型 #…

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