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. 无法启动T-SQL 调试

    问题详情 解决办法 1.要在服务器本机,不要远程 2.用实例名,不要用.或者local 3.以Windows身份验证的administrator或者sqlserver身份验证的sa登录

  2. struts2视频学习笔记 29-30(Struts 2常用标签,防止表单重复提交)

    课时28 Struts 2常用标签解说 property标签 property标签用于输出指定值: <s:set name="name" value="'kk'&q ...

  3. javascript DOM操作HTML文档

    文档对象模型(DOM)是W3C为解决浏览器混战时代不同浏览器环境之间的差别而制定的模型标准.W3C将文档对象模型定义为:是一个能让程序和脚本动态 访问和更新文档内容.结构和样式的语言平台.提供了标准的 ...

  4. JS模块式开发

    问题:js文件须严格保证加载顺序(比如上例的1.js要在2.js的前面),依赖性最大的模块一定要放到最后加载,当依赖关系很复杂的时候,代码的编写和维护都会变得困难! C语言中模块开发-include ...

  5. loadrunner 如何做关联

    在页面中为了防止CRSF攻击,每次访问登录页面时,在浏览器器端生成一个token. 在提交时检验这个token是否有效,提交后token自动失效.   如果使用loadrunner来测试此系统话需要做 ...

  6. Centos 下搭建SVN + Apache 服务器(转载)

    安装软件包 ? 1 # yum install httpd ? 1 # yum install mod_dav_svn ? 1 # yum install subversion 2.  验证安装 ? ...

  7. Understanding Weak References

    Understanding Weak References Posted by enicholas on May 4, 2006 at 5:06 PM PDT Some time ago I was ...

  8. 哈希(Hask)

     编辑 Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值.这种转换是一种压缩映射 ...

  9. 国内HTML5前端开发框架汇总

    国内HTML5前端开发框架汇总 Dawei Cheng 程大伟... 于 星期日, 02/12/2012 - 20:53 提交 国外很有多优秀的HTML5前端开发框架相信大家都耳熟能详:JQuery ...

  10. Oracle创建用户并给用户授权查询指定表或视图的权限

    MSV31账户登录数据库进行如下操作: CREATE USER NORTHBOUND IDENTIFIED BY NORTHBOUND  DEFAULT TABLESPACE "TBS_DN ...