Problem How Many Triangles (HDU 5784)

题目大意

  给定平面上的n个点(n《2000),询问可以组成多少个锐角三角形。

解题分析

  直接统计锐角三角形较困难,考虑问题的反面,统计直角三角形、钝角三角形、平角三角形(暂时这么叫吧QAQ)。

  首先枚举三角形的一个端点A,对其他点进行象限为第一关键字,极角为第二关键字排序。

  然后使用三个指针,进行O(n)的扫描。

  具体做法为用 i 指针指向三角形的第二个端点B。我们可以假想通过平移和旋转,把A点置于平面直角坐标系的原点,把B点置于x轴的正方向。那么可以与AB组成钝角或直角的点就在三四象限或者y轴。

  将 j 指针指向第一象限内可以组成锐角的最靠后的点,将k指针从j + 1 开始扫描至最后一个可以组成钝角的点,然后统计对答案的贡献。

  之后将 i 指针 +1,继续扫描。

  注意一些特殊的情况,可以写个暴力对拍,造点小数据debug。

参考程序

 #include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
#define eps 1e-8 struct P{
long long x,y;
int f;
friend P operator -(P a,P b){
return (P){a.x-b.x,a.y-b.y};
}
}a[],b[],S; int n,m; inline long long cross(P a,P b,P c){ //ab X ac
return (b.x-a.x)*(c.y-a.y)-(b.y-a.y)*(c.x-a.x);
} inline int calc(P a){
if (a.x> && a.y==) return ;
if (a.x> && a.y>) return ;
if (a.x== && a.y>) return ;
if (a.x< && a.y>) return ;
if (a.x< && a.y==) return ;
if (a.x< && a.y<) return ;
if (a.x== && a.y<) return ;
if (a.x> && a.y<) return ;
} inline bool cmp(const P a,const P b) {
if (a.f<b.f) return true;
if (a.f>b.f) return false;
long long tmp=cross(S,a,b);
if (tmp>) return true;
return false;
} inline bool ok(P a,P b,P c){
long long tmp=(b.x-a.x)*(c.x-a.x)+(b.y-a.y)*(c.y-a.y);
if (tmp>) return true;
return false;
} int main(){
while (~scanf("%d",&n)){
for (int i=;i<=n;i++) scanf("%I64d %I64d",&a[i].x,&a[i].y);
long long sum=;
for (int ii=;ii<=n;ii++){
S=a[ii]; m=;
for (int j=;j<=n;j++)
if (j!=ii) b[++m]=a[j];
for (int i=;i<=m;i++) b[i].f=calc(b[i]-S);
sort(b+,b+m+,cmp);
int i=,j=,k=;
while (ok(S,b[i],b[j]) && cross(S,b[i],b[j])>= && j<=m) j++;
if (j==m+) continue;
j--; k=j+;
while (i<=m)
{
if (!ok(S,b[i],b[k])){
while (!ok(S,b[i],b[k+]) && k<m) k++;
sum+=k-j;
}
i++;
if (j<i) j=i;
while (ok(S,b[i],b[j+]) && cross(S,b[i],b[j+])> && j<m) j++;
if (k<=j) k=j+;
if (k>m) break;
}
}
long long p=1ll*n*(n-)*(n-)/;
printf("%I64d\n",p-sum);
}
}

HDU 5784 (计算几何)的更多相关文章

  1. hdu 5784 How Many Triangles 计算几何,平面有多少个锐角三角形

    How Many Triangles 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5784 Description Alice has n poin ...

  2. hdu 2108:Shape of HDU(计算几何,判断多边形是否是凸多边形,水题)

    Shape of HDU Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

  3. HDU 2202 计算几何

    最大三角形 Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  4. *HDU 2108 计算几何

    Shape of HDU Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

  5. hdu 4720 计算几何简单题

    昨天用vim练了一道大水题,今天特地找了道稍难一点的题.不过也不是很难,简单的计算几何而已.练习用vim编码,用gdb调试,结果居然1A了,没调试...囧... 做法很简单,无非就是两种情况:①三个巫 ...

  6. HDU 5784 How Many Triangles

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

  7. HDU 6205[计算几何,JAVA]

    题目链接[http://acm.hdu.edu.cn/showproblem.php?pid=6206] 题意: 给出不共线的三个点,和一个点(x,y),然后判断(x,y)在不在这三个点组成的圆外. ...

  8. hdu 3320 计算几何(三维图形几何变换)

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

  9. *HDU 1007 计算几何

    Quoit Design Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tot ...

随机推荐

  1. Maximal Rectangle [LeetCode]

    Problem Description: Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle co ...

  2. iOS开发UIScrollView的底层实现

    起始 做开发也有一段时间了,经历了第一次完成项目的激动,也经历了天天调用系统的API的枯燥,于是就有了探索底层实现的想法. 关于scrollView的思考 在iOS开发中我们会大量用到scrollVi ...

  3. 《Play for Java》学习笔记(二)基本的CRUD应用

    注解:  CRUD——Create,Retrieve, Update, Delete 文件结构

  4. Mysql 修改列的顺序

    alter table 表名 modify 字段名 字段类型 after 字段举例alter table user_info modify user_name varchar(10) after us ...

  5. 项目中Enum枚举的使用

    在.NET中,枚举一般有两种常见用法,一是表示唯一的元素序列,比如表示订单状态(未提交,待处理,处理中...).另外一种是表示多种组合的状态,比如表示权限,因为可同时有多个不同权限. 基本用法 这里拿 ...

  6. 复利计算4.0单元测试(c语言)

    ——————————复利计算程序单元测试报告—————————— ————————————4.0 单元测试—————————————— ————————————————要求—————————————— ...

  7. CENTOS 修改MYSQL文件到内存盘

    # 必须说明的是: # 0 内存盘的特性是断电就丢数据. # 1 对数据时效性要求高的自己做主从 # 2 重启or关机必须导出数据和开机加载数据. # 3 最好弄个脚本 开关机自己调用. # 4 简单 ...

  8. python下的复杂网络编程包networkx的安装及使用

    由于py3.x与工具包的兼容问题,这里采用py2.7 1.python下的复杂网络编程包networkx的使用: http://blog.sina.com.cn/s/blog_720448d30101 ...

  9. Hello Struts2

    Struts2 概述 Struts2 是一个用来开发 MVC 应用程序的框架. 它提供了 Web 应用程序开发过程中的一些常见问题的解决方案: 对来自用户的输入数据进行合法性验证; 统一的布局; 可扩 ...

  10. WPF 画刷应用

    纯色: SolidColorBrush brush = new SolidColorBrush(Colors.White); window1.Background = brush; 渐变色: Line ...