[bzoj1914] [Usaco2010 OPen]Triangle Counting 数三角形
2015-12-23 20:05
344 查看
跑去看了黄学长的题解。。
第一次听说级角排序= =因为一直见计算几何就跑= =
级角排序就是按 原点和点连起来的边 与x轴正半轴构成的角的角度 排序。。。排序完效果就是逆时针旋转地枚举每个点。
要求的是覆盖原点的三角形个数。。黄金三角形各有各的姿势,但是没覆盖原点的三角形都是一个德行= =。如果一个三角形没覆盖到原点的话那么原点与三个顶点连线所跨的角度<180度。。所以如果两个点与原点连线的夹角<180度的话,那么它俩可以和它们中间的点组合成不覆盖原点的三角形。。。
总时间复杂度O(nlogn)(来自排序= =)。
抄黄学长代码结果#1了囧。。。
View Code
第一次听说级角排序= =因为一直见计算几何就跑= =
级角排序就是按 原点和点连起来的边 与x轴正半轴构成的角的角度 排序。。。排序完效果就是逆时针旋转地枚举每个点。
要求的是覆盖原点的三角形个数。。黄金三角形各有各的姿势,但是没覆盖原点的三角形都是一个德行= =。如果一个三角形没覆盖到原点的话那么原点与三个顶点连线所跨的角度<180度。。所以如果两个点与原点连线的夹角<180度的话,那么它俩可以和它们中间的点组合成不覆盖原点的三角形。。。
总时间复杂度O(nlogn)(来自排序= =)。
抄黄学长代码结果#1了囧。。。
#include<cstdio> #include<iostream> #include<cstring> #include<cstdlib> #include<cmath> #include<algorithm> #define d double #define ll long long using namespace std; const int maxn=100023; struct zs{ int x,y; d angel; }a[maxn]; int i,j,k,n,m,r; ll size,ans; int ra,fh;char rx; inline int read(){ rx=getchar();ra=0;fh=1; while((rx<'0'||rx>'9')&&rx!='-')rx=getchar(); if(rx=='-')fh=-1,rx=getchar(); while(rx>='0'&&rx<='9')ra*=10,ra+=rx-48,rx=getchar();return ra*fh; } bool cmp(zs a,zs b){ return a.angel<b.angel; } inline bool judge(int b,int c){ return (ll)a[b].x*a[c].y>=(ll)a[b].y*a[c].x; } int main(){ n=read(); for(i=1;i<=n;i++)a[i].x=read(),a[i].y=read(),a[i].angel=atan2(a[i].y,a[i].x); sort(a+1,a+1+n,cmp); ans=(ll)n*(ll)(n-1)*(ll)(n-2)/(ll)6; for(size=0,r=1,i=1;i<=n;i++){ while(r+1!=i&&judge(i,r+1)){ size++,r++; if(r>=n)r-=n; } ans-=(size-1)*size>>1; size--; } printf("%lld\n",ans); return 0; }
View Code
相关文章推荐
- Opencv--关于角点检测
- web在线打印,打印阅览,打印维护,打印设计
- poj 1456 Supermarket(并查集维护区间)
- opencv视频格式转换出现色彩异常的处理
- shell 随机从文件中抽取若干行
- 简单的MapReduce程序(Hadoop2.2.0)
- 网站首页内容该怎么规划?
- 用十条命令在一分钟内检查Linux服务器性能
- VS2012 +MFC+ OPenGL环境搭建
- linux 控制台挂载u盘拷贝文件
- 134,Copy,MutableCopy的应用与内存管理
- apache2.4 的mpm配置
- linux服务器 退出telnet 命令
- OC Copy自定义类
- OpenCV的一些基础知识
- CentOS根分区扩容方法
- Apache启动脚本的建立
- Linux 常见的单词缩写
- Opencv--常用操作函数讲解
- centos yum 只下载包 不安装