la4064

来源:互联网 发布:人工智能最好书籍 编辑:程序博客网 时间:2024/05/17 17:17

 此题卡了我一下午一直tle 后来在jesful大神指导下,对极角排序的单调性质重新理解了下。才ac的

此题用补集的性质,将钝角的部分算出来,然后用c(n,3)去剪就可以了。

首先将以i点为源点的极角算出来,然后排序,确定第二个点J 在1——(n-1)那么下面的做法就有不同了。

我们很容易想到枚举K点使得I J K构成的三角形是钝角。那么这样做法是o(n^3)我就是这样超时的。即使你k点的枚举是j+1开始的也会超时。

而且这地方还有就是要考虑明确当相减的时候会存在>pi的情况,那么这时候你要统计2pi-当前值的才是三角形的内角。

现在说下卡了我一下午的代码其实只有两行。

单调队列的优化是基于以下的思想:

够成钝角的点都是在平面的一个区间内的,并且这个区间,是随着J点极角的增大,单调向顺时针移动的。那么,既然有这个单调性,

我们就可以用类似单调队列的方法,随着J点的推移,那个要查找的区间端点也可以单调推移,光维护这端点,那么指针不回退,每个点扫描一次,达到了O(N),每个操作均摊O(1)

但是此题要维护的队列其实有两个即pi/2 和pi的区间。由于我一直在想怎么维护大于pi的那段区间去了,一直想不到。其实是不必要的。因为我们在维护同时在后继已经扫到了。

所以我只需要用pi的区间个数减去pi/2的区间个数就可以了。

对于此题如果大神觉得有误请指正!因为我看到网上有只用pi/2维护的个数 然后-c(n,3)*2 我一直不知道此方法是怎么做到ac的如果大神知道请指教!!!