首页 > 其他分享 >P6818 [PA2013]Działka 题解

P6818 [PA2013]Działka 题解

时间:2023-04-29 13:46:06浏览次数:48  
标签:ka 记录 题解 times P6818 vec 凸包 本题

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}\)

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

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

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

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

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


2.如何找凸包

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

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

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

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

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


3.如何记录答案

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

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

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

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

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


\(\bullet\) 加强版

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

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

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

Code

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

标签:ka,记录,题解,times,P6818,vec,凸包,本题
From: https://www.cnblogs.com/xztx666/p/17363914.html

相关文章

  • 天池编程大赛周赛-Character deletion 题解
    题目描述EntertwostringsanddeleteallcharactersinthesecondstringfromthefirststringStringcontainsspaces$1\leqlen(str),len(sub)\leq10^5$示例示例1:Input:str=”Theyarestudents”,sub=”aeiou”Output:”Thyrstdnts”来源:九章算法链接:ht......
  • github~通过packages功能实现maven仓库托管
    github在被大微软收购之后,推出了很多非常不错的功能,这一次把很多仓库管理合并到一起了,包括了nuget,npm,maven,docker等等,今天我们把java代码推到github的maven仓库吧!申请一个githubtoken建立一个仓库,起名为maven_repo配置你的.m2/settings.xml文件<settingsxmlns="http://maven.a......
  • P3573 [POI2014]RAJ-Rally 题解
    非常好题目,爱来自xc。看到有向无环图,想到拓扑序。通过拓扑序,可以轻松求出以每个点为起点的最长路\(disS\)与每个点为终点的最长路\(disF\)。如何求总共的最长路?在\(disS,disF,disS_u+1+disF_v((u,v)\inE)\)中取最大值即可。注意最后一项,表示将连边的二点值相加。......
  • 题解 CF1264D1
    前言数学符号约定:\(\dbinom{n}{m}\):表示\(n\)选\(m\)。如非特殊说明,将会按照上述约定书写符号。题目分析:考虑题目的问题弱一点的版本,假设此时我们的括号序列是确定的如何求其括号匹配的最深深度。如果你有些许dp基础的话,不难想到如下做法:考虑位置\(i\),将区间\([1,......
  • 题解 CF1264D2
    前言建议大家看一下我对于D1的题解(传送门)后再看本题解,本题解是基于那篇题解的基础上书写的。数学符号约定\(\dbinom{n}{m}\):表示\(n\)选\(m\)。如非特殊说明,将会按照上述约定书写符号。题目分析首先引用一下D1的答案:\(\displaystyle\sum_{i=1}^n\displaystyle\sum_{......
  • [ARC125E] Snack 题解
    不难发现一个较简单的网络流模型:源点向所有糖果\(i\)连\(a_i\)的容量;所有糖果向所有人\(i\)连\(b_i\)的容量;所有人\(i\)向汇点连\(c_i\)的容量。但第二步中建出的边数达到了惊人的\(O(nm)\),显然过不去。考虑优化。从最大流角度优化较困难,由于最大流等价于最小......
  • P4423 题解
    前言题目传送门!更好的阅读体验?刚学分治就来写篇题解纪念一下,其实和平面最近点对一样的(总共四倍经验!)。思路根据P7883的分治思路,这题我们可以考虑用相似的方法解决。首先将点集按\(x\)坐标从小到大排序。然后分治。对于\(\left[l,r\right]\)区间,分治为\(\left[l,mid......
  • 题解 P3225 [HNOI2012] 矿场搭建
    解析传送门一道简单的tarjan题题意:在无向图中找一些点,这些点组成的的点集记为\(V\),使得去掉任意一个点,剩下的每一个点都可以到达\(V\)中任意一个点,求点集\(V\)的大小的最小值及其方案数。去掉一个点,很自然的联想到割点,那么考虑一下割点在不在备选集合中。如图,显然可以看出,......
  • Codeforces Round 868 (Div. 2) A-E题解
    比赛地址这把真不在状态,麻了,看来还得再练A.A-characteristic题意:给出n和k,要求构造只含1和-1数组a,存在k对(i,j)(i≠j),有a[i]*a[j]=1Solution令构造的数组有x个1和y个-1,那么其对于答案的贡献有\[x*(x-1)/2+y*(y-1)/2\]又因为有x+y=n,所以可以转化成关于x的一元二次方程化简后......
  • COMPSCI 589 问题解答
    COMPSCI589Homework4-Spring2023DueMay6,2023,11:55pmEasternTime1InstructionsThishomeworkassignmentconsistsofaprogrammingportion.Whileyoumaydiscussproblemswithyourpeers,youmustanswerthequestionsonyourownandimplementall......