2017-2018 ACM-ICPC, NEERC, Moscow Subregional Contest

地址

Rank Solved A B C D E F G H I J
51/298 6/10 O . O O . . O O O Ø

O: 当场通过

Ø: 赛后通过

.: 尚未通过

A Advertising Strategy

solved by chelly


chelly's solution

签到

B Byteland Trip

unsolved


C Carpet

solved by chelly&ch


chelly's solution

D Decoding of Varints

solved by syf


E Empire History

unsolved


F Fake or Leak?

unsolved


G God of Winds

solved by ch


ch's solution

H Hilarious Cooking

solved by chelly


chelly's solution

I Infinite Gift

solved by ch&syf&chelly


chelly's solution

J Judging the Trick

upsolved by ch


ch's solution

这个sb题写的我心态炸了。。。。交了快20发了。。。
题意:给你一个矩形,矩形内部有1e5个三角形,这些三角形可能有交集,要求寻找一个不被覆盖的矩形上的点。
题目保证三角形的面积和小于矩形面积和。

题解:网上看到挺多奇奇怪怪的解法的。。。。。我的做法应该基本上是综合了很多别人的解法才给出的把。。。。
首先这个题目我们应该是第一时间想到三角面积并。。。三角面积并的基本办法是对三角形所有端点和交点进行离散化,做扫描线然后再用个数据结构统计。其实如果N比较小的话,用三角形面积并改改就能过了。不过由于求三角形的交点个数是N^2的(不知道有没有高论),我们并不能进行求交点的操作。

这个时候我们发现了题目的要求“题目保证三角形的面积和小于矩形面积和“,这很关键,这意味着,假设有一条与y轴平行的直线(简称竖线),竖线与所有三角形的交一定是一个线段(也可能是一个点,或者无交集),题目的这个条件使得我们能证明”一定存在一条竖线,其与所有三角形的交线段的长度和小于H“。我们的目标就是找到这条竖线然后再寻找相应的点。

  1. 找到这条竖线之后做什么
    如果找到一条竖线的话,我们就可以计算出竖线与所有三角形的交线段,我们把这个线段视为一个区间,这样我们寻找一个平面上非覆盖点的问题,就转变成了在一个线段上,有多个区间,我们要寻找一个不被区间覆盖的点的问题。这个问题我觉得在座的各位都会做就不多说了。

  2. 如何找到这条竖线
    基本思路还是离散化扫描线处理,不过我们不对交点离散化,只对端点离散化。我们可以发现,在经过离散化之后,三角形的一条边都变成的一条线段,我们如果用二维坐标系的函数来表示这条线段,我们就可以用一个一次函数y = ax + b表示这条线段。我们可以发现,对于一个三角形,我们希望求他与某条竖线的交线段的长度,这个长度可以表示为两个一次函数相减(当然是分段函数)。如果三角形处于上方的一条边的函数是y1 = a1x + b1,下方的一条边为y2 = a2x + b2,那么这个交线段的长度的函数为l =y1-y2 = (a1-a2)x + (b1-b2)
    我们在离散化之后就能够把交线段的长度函数按照离散化后的区间分段。
    由于三角形的一条边可能会覆盖多个区间,因此我们需要用数据结构来维护这个函数,要维护一次函数的和,实际上我们只需要维护“a的和”和“b的和”即可。
    这个数据结构需要满足的操作是:多次区间加,最后进行单点查询,所以选用差分-前缀和的方式处理。

  3. 细节处理
    按照以上逻辑,我们可以发现,如果竖线A上的交线段和为SA,相邻的竖线B上的和为SB,那么在竖线A和竖线B之间的长度一定满足 (a * SA + (1-a) * SB) (0 <= a <= 1)的关系。所以理论上说,极值一定存在与离散化后的每个X上。又从精度的考虑,我们应该寻找交线段和最小的一个竖线,也就说。。。。。。。。。。。。。但是不知道是不是我写挂的了原因,这么搞的话会WA得心态爆炸。。。。
    最后我是当作每条竖线都设置在离散化之后的两个相邻X的平均值上才A的。。。

Replay

原文地址:https://www.cnblogs.com/Amadeus/p/9973171.html