题目大意
给定平面上n个整点。m次询问,每次给出一个整点P,问n个点加上P之后形成的凸包面积为多少。
n,m≤100000
分析
首先可以给n个点求个凸包,然后就是计算加上P之后凸包增加的面积。
先判掉凸包是一个点或线段的情况。接下来讲一般情况。
如果能找到过点P的两个切线就可以求增加的面积了。
假设P在凸包外面,那么可以考虑先随便在凸包上确定一个点Q,然后直线PQ和凸包有两个交点(如果这条直线恰好是一条切线则只有一个交点)。这样可以把凸包分成两部分,每一部分以P为原点相邻之间求叉积正好是一段正数一段负数,可以二分求切线。
现在问题是如何求另一个交点。容易发现以P为原点时,凸包上除Q外的点也满足一段在PQ左边,一段在PQ右边。所以也可以二分找交点。
确定了两条切线后,可以用叉积求增加的面积。把式子拆开就是一个区间和的形式了。
时间复杂度 O(nlogn)
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const int N=1e5+5;
typedef long long LL;
typedef double db;
int