How Many Triangles (极角排序 + 尺取法)
题意:二维平面与有很多个点,然后求构成锐角三角形的个数。
思路:对于每一个三角形我们知道存在至少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 (极角排序 + 尺取法)的更多相关文章
- [CF1025F]Disjoint Triangles[极角排序+组合计数]
题意 平面上有 \(n\) 个点,选出六个点构成两个三角形,问有多少种构造方式使得两个三角形没有交集. \(n\leq 2000\) 分析 枚举连接两个三角形的两个顶点,同时能够将两个三角形划分在直线 ...
- hdu-5784 How Many Triangles(计算几何+极角排序)
题目链接: How Many Triangles Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- 【计算几何】【极角排序】【二分】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三角形. 枚举每个点作为直角顶点,对其他点极角排序,同方向的按长度排序,然后依次枚举每个向量,与其对应的另一条直角边是单调 ...
- nyoj133_子序列_离散化_尺取法
子序列 时间限制:3000 ms | 内存限制:65535 KB 难度:5 描述 给定一个序列,请你求出该序列的一个连续的子序列,使原串中出现的所有元素皆在该子序列中出现过至少1次. 如2 8 ...
- 51nod-1686 第K大区间(二分+尺取法)
题目链接: 第K大区间 基准时间限制:1 秒 空间限制:131072 KB 定义一个区间的值为其众数出现的次数.现给出n个数,求将所有区间的值排序后,第K大的值为多少. Input 第一行两个数 ...
- POJ_2566_Bound_Found_(尺取法+前缀和)
描述 http://poj.org/problem?id=2566 给出一个整数序列,并给出非负整数t,求数列中连续区间和的绝对值最接近k的区间左右端点以及这个区间和的绝对值. Bound Found ...
- POJ2566-Bound Found (尺取法)
POJ2566-Bound Found 题目大意:给出一段长度为n的数列,数列中的元素有正有负,求一段连续的区间,使得该区间的和的绝对值最接近给定的值 尺取法一般适用于对一段连续的区间的和进行处理的情 ...
- 【尺取法】Jurisdiction Disenchantment
[尺取法]Jurisdiction Disenchantment PROBLEM 时间限制: 1 Sec 内存限制: 128 MB 题目描述 The Super League of Paragons ...
- poj 2566"Bound Found"(尺取法)
传送门 参考资料: [1]:http://www.voidcn.com/article/p-huucvank-dv.html 题意: 题意就是找一个连续的子区间,使它的和的绝对值最接近target. ...
随机推荐
- TDD学习笔记【六】一Unit Test - Stub, Mock, Fake 简介
这篇文章简介一下,如何通过 mock framework,来辅助我们更便利地模拟目标对象的依赖对象,而不必手工敲堆只为了这次测试而存在的辅助类型. 而模拟目标对象的部分,常见的有 stub objec ...
- Zuul小技巧 /routes
Zuul有一个非常实用的 /routes 端点,当Zuul没有按照我们的计划去转发请求! 访问 $ZUUL_URL/routes 即可查看当前Zuul的路由规则,从而在很多情况下能够帮助我们定位Zuu ...
- Java开发面试题整理(2019春招)
一.Java基础部分 1. HashMap和Hashtable各有什么特点,它们有什么区别?(必背题,超级重要) HashMap和Hashtable都实现了Map接口,但决定用哪一个之前先要弄清楚它们 ...
- Cesium高度解析
var viewer = new Cesium.Viewer('cesiumContainer', { shadows : true }); //为true时,球体会有高程遮挡效果(在没有地形时候也会 ...
- 安装jdk配置环境变量JAVA_HOME不起作用
今天重新安装系统,需要装jdk,配置环境变量,于是先配置JAVA_HOME D:\Program Files\Java\jdk1.8.0_144, 然后在配置path路径,但是cmd到dos命令行输 ...
- 如何查看SQL SERVER数据库当前连接数
SELECT * FROM[Master].[dbo].[SYSPROCESSES] WHERE [DBID] IN ( SELECT [DBID]FROM [Master].[dbo].[SYSDA ...
- 面向对象的类关系及其C++实现
在面向对象的程序设计中,类之间有6中关系,分别是继承, 组合, 聚合,关联, 依赖,实现,如果使用C语言实现,上面的这些关系通过"结构体包含结构体.结构体包含结构体指针以及函数指针等语法实现 ...
- How to write threats to validity?
Paper reference Threats to construct validity are concerned with the relationship between theory and ...
- C# 鼠标移动Winform窗体内或者panel容器内的控件 显示虚线/实现虚线框来确定位置
C# 鼠标移动WinForm窗体或者panel容器内的控件 移动虚线/实现虚线框来确定位置 1.用到的方法介绍 今天,根据领导指示指导移动容器内的控件,生成虚线框,使用 ControlPaint.Dr ...
- 守护线程daemon
如下代码: from threading import Thread import time def func1(n): time.sleep(10) print(n) t = Thread(targ ...