博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj1914
阅读量:5092 次
发布时间:2019-06-13

本文共 1523 字,大约阅读时间需要 5 分钟。

极角排序

先开始想了很多分割方法,发现都不对,最后觉得只能极角搞搞,就看了答案

我们发现,一个点的原点构成的直线把平面分成了两半,那么只由一边点和这个点构成的三角形肯定不包含原点,那么我们按极角排序,然后计算右边有多少点C(x,2)就行了。因为一个三角形有三个点,枚举到中间那个点的时候这个三角形不会被计算,而如果两边都计算的话就会算重两次,于是我们只计算在右边的三角形就不会重负和遗漏了

极角排序就是计算atan2(y,x),计算出和x轴的弧度夹角,按这个排序就行了

#include
using namespace std;const int N = 100010;const double pi = acos(-1);struct points { double x, y, angle; points(double x = 0, double y = 0, double angle = 0) : x(x), y(y), angle(angle) {} bool friend operator < (points A, points B) { return A.angle < B.angle; }} a[N];int n, cnt, pos;long long ans;inline long long Sum(long long x){ return x * (x - 1ll) * (x - 2ll) / 6ll;}inline long long calc(long long x){ return x * (x - 1ll) / 2ll;}inline double A(double x){ return x > 0 ? x : 2 * pi + x;}int main(){ scanf("%d", &n); ans = Sum(n); for(int i = 1; i <= n; ++i) { double x, y, angle; scanf("%lf%lf", &x, &y); angle = atan2(y, x); if(angle < 0) angle += 2 * pi; a[i] = points(x, y, angle); } sort(a + 1, a + n + 1); for(int i = 2; i <= n; ++i) if(a[i].angle - a[1].angle > pi) { pos = i; break; } cnt = pos - 1; for(int i = 1; i <= n; ++i) { --cnt; while(A(a[pos].angle - a[i].angle) < pi && pos != i) { ++pos; pos = (pos - 1) % n + 1; ++cnt; } ans -= calc(cnt); } printf("%lld\n", ans); return 0;}
View Code

 

转载于:https://www.cnblogs.com/19992147orz/p/7435191.html

你可能感兴趣的文章
Python设计模式之单例模式
查看>>
eclipse中server location为灰色,不能修改
查看>>
shift and算法
查看>>
MongoDB数据库导出导入迁移
查看>>
CentOS 7 重装mysql编译过程报错解决方法
查看>>
《你必须知道的.NET》书中对OCP(开放封闭)原则的阐述
查看>>
最短路+状压DP【洛谷P3489】 [POI2009]WIE-Hexer
查看>>
LightOJ - 1050 (唯一分解+推公式+乘法逆元)
查看>>
线性模型的概率分析
查看>>
unity中动态生成网格
查看>>
windows下docker的安装及常用命令学习
查看>>
一个自己主动依据xcode中的objective-c代码生成类关系图的神器
查看>>
leetCode 103.Binary Tree Zigzag Level Order Traversal (二叉树Z字形水平序) 解题思路和方法...
查看>>
等额本金-c语言俩个整数除法
查看>>
观察者模式
查看>>
(二十一)访问者模式-代码实现
查看>>
判断 wp 是否是活跃页面
查看>>
Unity3D界面功能操作讲解【转http://www.cnblogs.com/fortomorrow/archive/2012/10/28/unity01.html】...
查看>>
js编码问题
查看>>
iOS 25个性能优化/内存优化常用方法
查看>>