「CodeForces-1195F」Geometers Anonymous Club
给定n个凸包,求第l个到第r个凸包的Minkowski和
题解
求凸包之间的闵可夫斯基和:取出两个凸包的每一条向量,按照极角序排序构成新凸包即可。(相同斜率的向量需要去重)
求多个凸包的闵可夫斯基和的时候可以直接取所有凸包的向量,不同向量的个数就是求和之后凸包的点数。
所以原问题转化为,在第l到r个凸包的向量中,有多少个互不相同的向量。
考虑对向量按凸包从左到右依次编号,标记当前向量上一次出现的位置(如果是第一次出现则pre[i]=0)。离线处理答案,按向量编号从小到大顺序扫描向量集,对向量i
上一次出现的位置pre[i]
的出现次数计数,用树状数组维护。对于某一个询问Q的L和R,如果存在L<=i<=r
且L<=pre[i]<=r
,说明该向量在LR区间内重复出现。对于右端点为R的询问LR,它的答案为L到R的凸包的向量总数-LR区间内重复出现的向量个数。
代码
1 |
|