How Many Triangles

题目连接:

http://acm.hdu.edu.cn/showproblem.php?pid=5784

Description

Alice has n points in two-dimensional plane. She wants to know how many different acute triangles they can form. Two triangles are considered different if they differ in at least one point.

Input

The input contains multiple test cases.

For each test case, begin with an integer n,

next n lines each contains two integers xi and yi.

3≤n≤2000

0≤xi,yi≤1e9

Any two points will not coincide.

Output

For each test case output a line contains an integer.

Sample Input

3

1 1

2 2

2 3

3

1 1

2 3

3 2

4

1 1

3 1

4 1

2 3

Sample Output

0

1

2

Hint

题意

平面给你2000个不重合的点,问你有多少个锐角三角形

题解:

数一数锐角的数量A和直角+钝角的数量B,那么答案就是(A-2B)/3。 暴力算的话是\(O(n^3)\)的。使用极角排序+two pointers就可以做到\(O(n^2log\ n)\)

这边钝角指代范围在90度到180度之间的角(不包括90和180)。

我们枚举一个点,算出所有向量,然后枚举一个向量,towpointer很容易算出直角那条线,和钝角那条线,然后就可以统计个数了。

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 2005;
const int Q = 1e9 + 7; struct Point {
int x , y;
Point (int _x = 0 , int _y = 0) {
x = _x , y = _y;
}
Point operator - (const Point &R) const {
return Point(x - R.x , y - R.y);
}
LL operator ^ (const Point &R) const {
return (LL)x * R.y - (LL)y * R.x;
}
LL operator % (const Point &R) const {
return (LL)x * R.x + (LL)y * R.y;
}
bool sign() const {
return y > 0 || (y == 0 && x > 0);
}
bool operator < (const Point &R) const {
if (sign() != R.sign()) {
return sign() > R.sign();
}
return (*this ^ R) > 0;
}
};
int n;
Point P[N]; void work() {
for (int i = 0 ; i < n ; ++ i) {
scanf("%d%d" , &P[i].x , &P[i].y);
}
LL res = 0;
for (int i = 0 ; i < n ; ++ i) {
vector<Point> V;
for (int j = 0 ; j < n ; ++ j) {
if (P[j].x != P[i].x || P[j].y != P[i].y)
V.push_back(P[j] - P[i]);
} sort(V.begin() , V.end());
int m = V.size();
int e = 0 , p = 0 , w = 0;
for (int j = 0 ; j < m ; ++ j) {
while (e < m && (V[j] ^ V[(j + e) % m]) == 0) {
++ e;
}
p = max(e , p);
while (p < m && ((V[j] ^ V[(j + p) % m]) > 0 && (V[j] % V[(j + p) % m]) > 0)) {
++ p;
}
w = max(w , p);
while (w < m && ((V[j] ^ V[(j + w) % m]) > 0 && (V[j] % V[(j + w) % m]) <= 0)) { ++ w;
}
res += p - e;
res -= 2 * (w - p);
e = max(1 , e - 1);
p = max(1 , p - 1);
w = max(1 , w - 1);
}
}
cout << res / 3 << endl;
} int main() {
while (~scanf("%d" , &n)) {
work();
}
return 0;
}

hdu 5784 How Many Triangles 计算几何,平面有多少个锐角三角形的更多相关文章

  1. HDU 5784 How Many Triangles

    计算几何,极角排序,双指针,二分. 直接找锐角三角形的个数不好找,可以通过反面来求解. 首先,$n$个点最多能组成三角形个数有$C_n^3$个,但是这之中还包括了直角三角形,钝角三角形,平角三角形,我 ...

  2. HDU 5784 (计算几何)

    Problem How Many Triangles (HDU 5784) 题目大意 给定平面上的n个点(n<2000),询问可以组成多少个锐角三角形. 解题分析 直接统计锐角三角形较困难,考虑 ...

  3. hdu-5784 How Many Triangles(计算几何+极角排序)

    题目链接: How Many Triangles Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  4. HDU 5839 Special Tetrahedron (计算几何)

    Special Tetrahedron 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5839 Description Given n points ...

  5. hdu 2393:Higher Math(计算几何,水题)

    Higher Math Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  6. 计算几何 平面最近点对 nlogn分治算法 求平面中距离最近的两点

    平面最近点对,即平面中距离最近的两点 分治算法: int SOLVE(int left,int right)//求解点集中区间[left,right]中的最近点对 { double ans; //an ...

  7. HDU 1249 三角形(三角形分割平面)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1249 三角形 Time Limit: 2000/1000 MS (Java/Others)    Me ...

  8. HDU 4173 Party Location(计算几何,枚举)

    HDU 4173 题意:已知n(n<=200)位參赛选手的住所坐标.现要邀请尽可能多的选手来參加一个party,而每一个选手对于离住所超过2.5Km的party一律不去,求最多能够有多少个选手去 ...

  9. HDU 6351暴力枚举 6354计算几何

    Beautiful Now Time Limit: 5000/2500 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)T ...

随机推荐

  1. 洛谷 P4910 帕秋莉的手环 矩阵乘法+快速幂详解

    矩阵快速幂解法: 这是一个类似斐波那契数列的矩乘快速幂,所以推荐大家先做一下下列题目:(会了,差不多就是多倍经验题了) 注:如果你不会矩阵乘法,可以了解一下P3390的题解 P1939 [模板]矩阵加 ...

  2. 20155303 实验四 Android程序设计

    20155303 实验四 Android程序设计 目录 第24章:初识Android 任务一: 完成Hello World, 要求修改res目录中的内容,Hello World后要显示自己的学号 学习 ...

  3. 用《舌尖2》去理解C#中的多态和开闭原则

    昨天晚上看了<舌尖上的中国2>第一集,特别的感人,尤其是看到帮别人割麦子的麦客,一亩地开价200,雇主只肯给100,脸上的那种纠结和无可奈何.还有长着大眼睛的跳跳鱼,很可爱,不过最终还是被 ...

  4. Ansible Tower系列 二(安装 Tower)【转】

    文档:http://docs.ansible.com/ansible-tower/ 安装前检查 python版本为2.6 保持网络畅通 内存预留充足 安装用户为root 软件下载 下载地址:http: ...

  5. wordpress配置通过IP直接访问及apache的配置

    wordpress配置通过IP直接访问 环境: 操作系统:centos6.5 yum安装lamp环境: yum -y install mysql mysql-server php php-mysql ...

  6. (转)javascript方法--bind()

    地址:https://www.cnblogs.com/xxxxBW/p/4914567.html bind方法,顾名思义,就是绑定的意思,到底是怎么绑定然后怎么用呢,下面就来说说我对这个方法的理解. ...

  7. C/C++的64位整型

    在C/C++中,64为整型一直是一种没有确定规范的数据类型.现今主流的编译器中,对64为整型的支持也是标准不一,形态各异.一般来说,64位整型的定义方式有long long和__int64两种(VC还 ...

  8. python3.6连接oracle数据库

    下载cx_Oracle模块模块: https://pypi.python.org/pypi/cx_Oracle/5.2.1#downloads 这里下载的是源码进行安装 [root@oracle or ...

  9. 前端如何在h5页面调用微信支付?

    在微信服务号开发的时候经常会遇到微信支付的功能实现,通过实际经验自己总结了一下,前端在H5页面调起微信支付有两种办法,一是利用内置对象,二是通过引用微信的js sdk,亲测都能支付成功,从写法上来看用 ...

  10. Java 构造 BSON 数据类型

    Java 构造 BSON 数据类型 整数/符浮点数 Java BSON 构造整数/符浮点数类型 // {a:123, b:3.14} BSONObject obj = new BasicBSONObj ...