Description

在一只大灰狼偷偷潜入Farmer Don的牛群被群牛发现后,贝西现在不得不履行着她站岗的职责。从她的守卫塔向下瞭望简直就是一件烦透了的事情。她决定做一些开发智力的小练习,防止她睡着了。

想象牧场是一个X,Y平面的网格。她将N只奶牛标记为1…N (1 <= N <= 100,000),每只奶牛的坐标为X_i,Y_i (-100,000 <= X_i <= 100,000;-100,000 <= Y_i <= 100,000; 1 <= i <=N)。然后她脑海里想象着所有可能由奶牛构成的三角形。如果一个三角形完全包含了原点(0,0),那么她称这个三角形为“黄金三角形”。原点不会落在任何一对奶牛的连线上。另外,不会有奶牛在原点。

给出奶牛的坐标,计算出有多少个“黄金三角形”。

Input

  • 第一行:一个整数N

  • 第2到第N+1行:每行两个整数X_i,Y_i,表示每只牛的坐标

Output

  • 第一行: 一行包括一个整数,表示“黄金三角形的数量”

Sample Input

5
-5 0
0 2
11 2
-11 -6
11 -5

Sample Output

5

Hint

考虑五只牛,坐标分别为(-5,0), (0,2), (11,2), (-11,-6), (11,-5)。

下图是由贝西视角所绘出的图示。

      ............|........................*..........*.............|............-------*----+------------............|........................|........................|........................|........................|..........*..*..........|........................|............

Solution

  • 正难则反,总组合数为 C3nC_n^3 ,只要求出不过原点的三角形个数即可。

  • 现将每个点进行极角排序(以原点为顶点、两边分别为 x的正半轴 和 原点与这个点的连边)

  • 按角从小到大枚举,统计连续的一段,使得组成的三角形不包含原点,则该段可以两两匹配。

  • 判断其是否包含原点,只需要判断两向量的叉积是否大于0即可(大于0则不包含)。

  • 时间复杂度为 O(N log N)O(N\ log\ N) 。

Code

#include<cstdio>
#include<algorithm>
#include<cctype>
#include<complex>
using namespace std;
typedef long long LL;
typedef complex<LL> point;
const int N=1e5+2;
point a[N<<1];
inline int read()
{int X=0,w=0; char ch=0;while(!isdigit(ch)) w|=ch=='-',ch=getchar();while(isdigit(ch)) X=(X<<3)+(X<<1)+(ch^48),ch=getchar();return w?-X:X;
}
inline bool upper(point x)
{return x.imag()>0 || !x.imag() && x.real()>0;
}
inline LL cross(point x,point y)
{return x.real()*y.imag()-x.imag()*y.real();
}
inline bool cmp(point x,point y)
{bool xx=upper(x),yy=upper(y);if(xx && !yy) return true;if(!xx && yy) return false;return cross(x,y)>0;
}
int main()
{int n=read();for(int i=1;i<=n;i++) a[i].real()=read(),a[i].imag()=read();sort(a+1,a+1+n,cmp);LL ans=n*1LL*(n-1)*(n-2)/6;for(int i=1;i<=n;i++) a[i+n]=a[i];for(int i=1,j=1;i<=n;i++){while(j<i+n-1 && cross(a[i],a[j+1])>0) j++;ans-=(j-i)*1LL*(j-i-1)/2;}printf("%lld",ans);return 0;
}

JZOJ 3129. 【WinterCamp 2013】数三角形相关推荐

  1. 一本通1655数三角形

    1655:数三角形 时间限制: 1000 ms         内存限制: 524288 KB [题目描述] 给定一个 n×m 的网格,请计算三点都在格点上的三角形共有多少个.下图为 4×4 的网格上 ...

  2. 组合计数——车的放置(逆元)+数三角形+序列统计(lucas定理)

    通用传送门:https://www.acwing.com/activity/content/16/ 思路:设C(a,b)为从a中取出b个的组合数,设A(a,b)从a中选出b个进行排列的排列数. 对于题 ...

  3. 组合数学——数三角形

    数三角形 给定一个 n×m 的网格,请计算三点都在格点上的三角形共有多少个. 下图为 4×4 的网格上的一个三角形. 注意:三角形的三点不能共线. 输入格式 输入一行,包含两个空格分隔的正整数 m 和 ...

  4. 2023NHOI数三角形题解

    第五题数三角形(e.cpp)[题目描述]已知一个包含n个非负整数的数组a,要从中选出三个数作为三角形的三条边的边长,有多少种不同的选法.注意:要组成三角形需要满足的条件是任意两边之和大于第三边.[输入 ...

  5. bzoj3505 / P3166 [CQOI2014]数三角形

    P3166 [CQOI2014]数三角形 前置知识:某两个点$(x_{1},,y_{1}),(x_{2},y_{2})\quad (x_{1}<x_{2},y_{1}<y_{2})$所连成 ...

  6. P3166 [CQOI2014]数三角形(组合数学)

    P3166 [CQOI2014]数三角形(组合数学) 整点三角形个数. 正难则反,求出总方案和共线三角形方案数即可. 总方案:C((n+1)(m+1),3)C((n+1)(m+1),3)C((n+1) ...

  7. 计蒜客NOIP模拟赛 数三角形

    数三角形 题目描述 刚刚上高中的洁洁在学习组合数学的过程中遇到一道麻烦的题目,她希望你能帮助她解决.给定一张无向完全图 G,其中大部分边被染成蓝色,但也有一些边被染成红色或者绿色.现在,洁洁需要给这张 ...

  8. 数三角形 (组合数学+分类讨论)

    数三角形 [Link](信息学奥赛一本通(C++版)在线评测系统 (ssoier.cn)) 题意 给定一个 n × m n\times m n×m的网格,请计算三点都在格点上的三角形共有多少个. 题解 ...

  9. BZOJ 3505 [Cqoi2014]数三角形(组合数学)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3505 [题目大意] 给定一个nxm的网格,请计算三点都在格点上的三角形共有多少个. 注 ...

最新文章

  1. ios cordova报gap://ready 弹出框,一直弹
  2. [爬虫]通过url获取连接地址中的数据
  3. 钱趣多风控新举措:源头选择与物理隔离
  4. 微信小程序php后台支付,微信小程序 支付功能实现PHP实例详解
  5. [转]html超链接打开的窗口大小
  6. Python字典(Dictionary)的setdefault()方法的详解,字典中的赋值技巧
  7. C++socket编程(七):7.1 http协议讲解,通过抓包和telnet分析
  8. 洛谷 1984 [SDOI2008]烧水问题
  9. Rust : actor模式 与 Actix库
  10. undo歌词中文音译_T-ara - Lovey Dovey 罗马拼音+中文歌词+韩文歌词+中文音译
  11. Spring Cloud 中文网
  12. Reaver无线破解工具——穷举PIN码破解简析
  13. Easypanel linux离线安装,easypanel
  14. icp经营许可证怎么办?
  15. ACCESS实例2 资料管理1——表、表关系与查询
  16. 多智能体强化学习入门
  17. 考研数据结构之数组(5.1)——练习题之移动数组所有非零元素到数组前端(C表示)
  18. java io流上传图片_SpringBoot上传图片和IO流的基本操作
  19. flutter 获取wifi名称以及Android10获取不到wifi名称<unknown ssid>
  20. python毕业论文开题报告_本科毕业论文开题报告怎么写-如何写毕业设计的开题报告?...

热门文章

  1. 数据采集中的采样率、缓冲区大小以及,每通道采样数之间的关系
  2. 给初学者们讲解人工神经网络(ANN)
  3. android 服务的应用,在Activity中实现背景音乐播放
  4. CentOS系统启动流程和系统初始化
  5. c++中的 extern C
  6. 【编程】堆(heap)和栈(stack)的区别
  7. 后台原理_从浏览器如何进入路由器后台【详细介绍】
  8. 独立成分分析ICA系列4:ICA的最优估计方法综述
  9. PIC单片机入门_输入输出端口详解
  10. python的.arsort()函数的用法