Link
Solution
好一道数据结构套计算几何题啊。。
(虽然是基础数据结构套基础计算几何。。但对我这种蒟蒻就已经有超强杀伤力了。。)
维护一个支持插入的向量序列,输出区间中的向量与给定向量最大的内积。
首先很容易看出答案向量的终点在凸包上。
还有一个看起来对但不会证的结论:给定向量与终点在凸包上的向量内积值是单峰的。
,在上凸壳上有最大值
,在下凸壳上有最大值
于是用线段树维护序列,每个节点维护区间的凸包。
但是凸包的合并类似Graham(Andrew),是的,每次都合并肯定合不起。
但是:一个区间只有塞满了之后才会被查询。
于是在区间塞满的时候再合并。这样合并的总复杂度是的。
查询的时候在凸包上三分。一开始想得是要把查询的区间在线段树上对应的个区间的凸包合并出来得到整个区间的凸包再三分。单次查询的复杂度就成了?
然后发现网上给出的做法都是分别在每个节点上三分,然后取最大值,解决问题。
Tips
如果信息合并的复杂度高,就根据查询的情况来减少合并的次数。 这个在每个节点上三分的做法可以类比区间第K大的线段树套平衡树做法,只是这个可能会产生一些无用的解,但不影响正确性和复杂度。
Code
1 | //Code by Lucida |