题意:二维平面与有很多个点,然后求构成锐角三角形的个数。

  思路:对于每一个三角形我们知道存在至少2个锐角,只要有一个钝角就不行了,所以我们的想法就是枚举所有夹角的状态,然后得知情况,确定用总个数减去-成线或者成钝角的数量/2(除以2是因为计算过程中重复了)。那么应该如何枚举?我们枚举夹角的顶点然后就出其他点的极角,排序,然后尺取法左端点表示与当前点为锐角的个数,右端点表示锐角+钝角,过程中相减可以得到锐角数量。

#include<bits/stdc++.h>
using namespace std; typedef long long ll;
const int maxn = + ;
struct P{
ll x, y;
P() {}
P(ll x, ll y): x(x), y(y) {}
P operator + (P p) {
return P(x + p.x, y + p.y);
}
void read() {
scanf("%lld%lld", &x, &y);
}
P operator - (P p) {
return P(x - p.x, y - p.y);
}
ll dot(P p) {//点积
return x * p.x + y * p.y;
}
ll det(P p) {//叉积
return x * p.y - y * p.x;
}
bool operator < (const P &p) const{
if(y * p.y <= ) {
if(y > || p.y > ) return y < p.y;
if(y == && p.y == )return x < p.x;
}
return x * p.y - y * p.x > ;
}
}p[maxn], q[maxn << ]; int main(){
int n;while(~scanf("%d", &n)) {
ll ans = 1ll * n * (n - ) * (n - ) / ;
ll line = ;
for(int i = ; i < n; i ++) p[i].read();
for(int i = ; i < n; i ++) {
int tot = ;
for(int j = ; j < n; j ++)
if(i != j) q[tot ++] = p[j] - p[i];
ll subtrat = ;
sort(q, q + tot);
for(int j = ; j < tot; j ++) q[j + tot] = q[j];
for(int j = ; j < tot; j ++) {
if(q[j - ].det(q[j]) == && q[j - ].dot(q[j]) > ) subtrat ++;
else subtrat = ;
line += subtrat;
}
int l = , r = ;
for(int j = ; j < tot; j ++) {
while(l <= j || (l < j + tot && q[l].det(q[j]) < && q[j].dot(q[l]) > )) l ++;
while(r <= j || (r < j + tot && q[r].det(q[j]) < )) r ++;
ans -= r - l;
}
}
printf("%lld\n",ans - line/);
}
return ;
}

How Many Triangles (极角排序 + 尺取法)的更多相关文章

  1. [CF1025F]Disjoint Triangles[极角排序+组合计数]

    题意 平面上有 \(n\) 个点,选出六个点构成两个三角形,问有多少种构造方式使得两个三角形没有交集. \(n\leq 2000\) 分析 枚举连接两个三角形的两个顶点,同时能够将两个三角形划分在直线 ...

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

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

  3. 【计算几何】【极角排序】【二分】Petrozavodsk Summer Training Camp 2016 Day 6: Warsaw U Contest, XVI Open Cup Onsite, Sunday, August 28, 2016 Problem J. Triangles

    平面上给你n(不超过2000)个点,问你能构成多少个面积在[A,B]之间的Rt三角形. 枚举每个点作为直角顶点,对其他点极角排序,同方向的按长度排序,然后依次枚举每个向量,与其对应的另一条直角边是单调 ...

  4. nyoj133_子序列_离散化_尺取法

    子序列 时间限制:3000 ms  |  内存限制:65535 KB 难度:5   描述 给定一个序列,请你求出该序列的一个连续的子序列,使原串中出现的所有元素皆在该子序列中出现过至少1次. 如2 8 ...

  5. 51nod-1686 第K大区间(二分+尺取法)

    题目链接: 第K大区间 基准时间限制:1 秒 空间限制:131072 KB    定义一个区间的值为其众数出现的次数.现给出n个数,求将所有区间的值排序后,第K大的值为多少. Input 第一行两个数 ...

  6. POJ_2566_Bound_Found_(尺取法+前缀和)

    描述 http://poj.org/problem?id=2566 给出一个整数序列,并给出非负整数t,求数列中连续区间和的绝对值最接近k的区间左右端点以及这个区间和的绝对值. Bound Found ...

  7. POJ2566-Bound Found (尺取法)

    POJ2566-Bound Found 题目大意:给出一段长度为n的数列,数列中的元素有正有负,求一段连续的区间,使得该区间的和的绝对值最接近给定的值 尺取法一般适用于对一段连续的区间的和进行处理的情 ...

  8. 【尺取法】Jurisdiction Disenchantment

    [尺取法]Jurisdiction Disenchantment PROBLEM 时间限制: 1 Sec 内存限制: 128 MB 题目描述 The Super League of Paragons ...

  9. poj 2566"Bound Found"(尺取法)

    传送门 参考资料: [1]:http://www.voidcn.com/article/p-huucvank-dv.html 题意: 题意就是找一个连续的子区间,使它的和的绝对值最接近target. ...

随机推荐

  1. IIS 配置详解 请求长度限制调整

    当上传一个超过30M的文件时,服务器会重定向至404.13页面,报错如下: HTTP Error 404.13 - Not Found The request filtering module is ...

  2. Maven项目错误解决小结

    http://blog.csdn.net/typa01_kk/article/details/49185759 Maven项目错误解决小结 注:整理错误,不喜欢为了一个小问题,占篇幅,所以请Ctrl+ ...

  3. mysql存储过程异常处理

    DELIMITER $$ USE `mtnoh_aaa_platform`$$ DROP PROCEDURE IF EXISTS `proc_eoms_electric_power_generatio ...

  4. Codeforces Round #498 (Div. 3)

    被虐惨了,实验室里数十位大佬中的一位闲来无事切题(二,然后出了5t,当然我要是状态正常也能出5,主要是又热又有蚊子什么的... 题都挺水的.包括F题. A: 略 B: 找k个最大的数存一下下标然后找段 ...

  5. vim 命令补充(1)

    本篇文章主要教你如何使用 Vim 分屏功能. 分屏启动Vim 使用大写的O参数来垂直分屏. vim -On file1 file2 ... 使用小写的o参数来水平分屏. vim -on file1 f ...

  6. Linux手动添加swap分区

    转自:https://blog.csdn.net/whatday/article/details/51024571 为什么需要swap 根据Redhat公司的建议,Linux系统swap分区最适合的大 ...

  7. javascript的数组之sort()

    sort()方法用in-place的算法对原数组进行排序,但不会产生新的数组.这个方法不是一个稳定的排序,默认采用的是安字符串Unicode码点进行排序的. let fruit =  ['cherri ...

  8. python语法_if判断

    age_of_princal = 56 guess_age = int(input("e guess a age:")) if guess_age == age_of_princa ...

  9. SVN和Git对比梳理

    在日常运维工作中,经常会用到版本控制系统,目前用到最广泛的版本控制器就是SVN和Git,那么这两者之间有什么不同之处呢?SVN(Subversion)是集中式管理的版本控制器,而Git是分布式管理的版 ...

  10. HTTP协议工作原理

    HTTP简介        超文本传输协议(HTTP:Hypertext Transport Protocol)是万维网应用层的协议,它通过两个程序实现:一个是客户端程序(各种浏览器),另一个是服务器 ...