博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ 1914: [Usaco2010 OPen]Triangle Counting 数三角形
阅读量:5033 次
发布时间:2019-06-12

本文共 853 字,大约阅读时间需要 2 分钟。

题意:给定平面上N(<=10^5)个整点,任意三点可以组成一个三角形,求把原点包含在内部的三角形个数。保证原点不在两点连线上。

我们反过来考虑,用总的三角形个数减去非法的三角形个数。

总的三角形个数是(N3)=N(N1)(N2)6
然后考虑非法三角形的情况,原点在三角形外部。作原点和三个点的连线,我们会发现一定是形成一个锐角,所以答案只跟每个点的极角有关。
于是把每个点按照极角序排序,用单调队列维护一个半平面上的点,每次加入一个点时,删除队尾与该点成顺时针的点,此时对答案的贡献就是(M2),M为队列中点的个数,最后加入这个点,具体实现见代码。
一些细节:把点按x坐标正负分成左右两部分,排序的时候就可以用叉积,单调队列扫的时候也用叉积判断。

代码:

#include 
using namespace std;typedef long long ll;const int MAXN = 100005;struct P{ll x, y;}A[MAXN], B[MAXN], q[MAXN<<2];ll operator*(P a, P b){
return a.x*b.y-a.y*b.x;} //叉积int cmp(P a, P b){
return a*b<0;}int na, nb, N;int main(){ scanf("%d", &N); for(int i=0; i
0 || (p.x==0 && p.y>0)) A[na++]=p; //右半部分 else B[nb++]=p; //左半部分 } sort(A, A+na, cmp); sort(B, B+nb, cmp); int hd=0, tl=0; for(int i=0; i

转载于:https://www.cnblogs.com/will7101/p/6506683.html

你可能感兴趣的文章
【4.1】Python中的序列分类
查看>>
html5 新属性
查看>>
ubuntu 移动文件
查看>>
BZOJ 4590: [Shoi2015]自动刷题机
查看>>
实现viewpager下的圆点滑动
查看>>
Linux CentOS6.5下编译安装MySQL 5.6.16【给力详细教程】
查看>>
58同城高性能移动Push推送平台架构演进之路
查看>>
如何回答面试中问到的Hibernate和MyBatis的区别
查看>>
设置Ubuntu 10.10版本的软件源
查看>>
android开发中的 Activity 与 Context 区别与联系
查看>>
数据库基线检查工具DB_BASELINE
查看>>
数据分析应用实战(一)
查看>>
中断和中断处理流程
查看>>
ByteBuffer常用方法详解
查看>>
Web APP开发技巧总结
查看>>
json_encode 中文
查看>>
LeetCode 77. 组合(Combinations)
查看>>
oracle11G安装过程中两个参数详解
查看>>
Easy Mock
查看>>
前端进阶之路
查看>>