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. Spring Data Jpa配置

    Spring Data JPA提供的接口,也是Spring Data JPA的核心概念: 1:Repository:最顶层的接口,是一个空的接口,目的是为了统一所有Repository的类型,且能让组 ...

  2. Nodejs异步异常处理domain

    前言 程序开发中,最麻烦的事情之一就是异常处理:对于Nodejs程序开发,最麻烦的事情莫过于异步异常处理. 以MVC的多层架构设计角度,异常总是要一层一层向上抛出,最后在客户端出打印错误.但是,Nod ...

  3. [转]Integer.valueOf(String) 方法之惑

    具体问题以前偶然遇到过,好象是一个java答题得分的论坛,当时做错还研究了下怎么回事,但是前两天遇到类似问题却没想起来.巩固下基础,转了下面文章. 以下内容转自:http://www.importne ...

  4. J2EE开发实战基础系列一 HelloWorld【转】

      开始咱们的第一个程序,首先是配置环境,按照上一章所描述的方式下载开发工具,然后配置Java环境变量,给大家看下具体的结构: 环境变量配置OK的提示,如上图. Eclipse和Tomcat的文件目录 ...

  5. ANGULARJS 动态编译添加到dom中

    在使用angularjs 时,希望通过动态构建angular模版,再通过angular进行展示. 使用 方法如下: <html ng-app="app"> <he ...

  6. cf731E

    题意:一个游戏,由n张贴纸组成.贴纸排成一排,并且纸条上标有数字,玩家轮流揭下m张从左到右连续的纸条(m大等2),揭下后玩家得分累加这些纸条的sum,并且在剩下纸条最左边贴上新的纸条,数值为揭下纸条的 ...

  7. treap codevs 4543普通平衡树

    #include<cstdio>#include<ctime>#include<cstdlib>struct shu{ int l,r,sum1,zhi,dui,s ...

  8. zoj2132-The Most Frequent Number

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2132 The Most Frequent Number Time Limi ...

  9. 二模 (5)day1

    第一题: 题目大意:解一元一次方程(只有+-符号): 解题过程:直接处理处两边的x的系数和常数项,字符串的处理即可. 第二题: 题目大意:求逆序对数. 解题过程:直接归并排序. 第三题: 题目大意:多 ...

  10. 《算法竞赛入门经典》5.12TeX括号

    /* *在TeX中,左双引号是``,右双引号是''.输入一篇包含双引号的文章,你的任务是把它转换成TeX的格式. *样例输入:"To be or not to be,"quoth ...