la4064

 此题卡了我一下午一直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的如果大神知道请指教!!!


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值