bzoj 1914: [Usaco2010 OPen]Triangle Counting 数三角形——极角排序
Posted 友人A
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bzoj 1914: [Usaco2010 OPen]Triangle Counting 数三角形——极角排序相关的知识,希望对你有一定的参考价值。
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),那么她称这个三角形为“黄金三角形”。原点不会落在任何一对奶牛的连线上。另外,不会有奶牛在原点。给出奶牛的坐标,计算出有多少个“黄金三角形”。顺便解释一下样例,考虑五只牛,坐标分别为(-5,0), (0,2), (11,2), (-11,-6), (11,-5)。下图是由贝西视角所绘出的图示。
Input
第一行:一个整数: N 第2到第N+1行: 每行两个整数X_i,Y_i,表示每只牛的坐标
Output
* 第一行: 一行包括一个整数,表示“黄金三角形的数量”
Sample Input
-5 0
0 2
11 2
-11 -6
11 -5
Sample Output
#include<cstdio> #include<cstring> #include<algorithm> #define LL long long using std::sort; const int M=2e5+7,inf=0x3f3f3f3f; int read(){ int ans=0,f=1,c=getchar(); while(c<‘0‘||c>‘9‘){if(c==‘-‘) f=-1; c=getchar();} while(c>=‘0‘&&c<=‘9‘){ans=ans*10+(c-‘0‘); c=getchar();} return ans*f; } int n; struct pos{int x,y,wh; double k;}q[M]; bool cmp(pos a,pos b){return a.wh!=b.wh?a.wh<b.wh:a.k>b.k;} int main(){ int x,y; n=read(); for(int i=1;i<=n;i++){ x=read(); y=read(); q[i].x=x; q[i].y=y; if(x) q[i].k=1.0*y/x; else q[i].k=-inf; if(x>0&&y>=0) q[i].wh=1; else if(x>=0&&y<0) q[i].wh=2; else if(x<0&&y<=0) q[i].wh=3; else q[i].wh=4; } LL ans=1LL*n*(n-1)*(n-2)/6; sort(q+1,q+1+n,cmp); LL sum=1,ly=2; for(int i=1;i<=n;i++){ sum--; while(1LL*q[ly].y*q[i].x<1LL*q[i].y*q[ly].x){ ly++; sum++; if(ly>n) ly-=n; } ans=ans-sum*(sum-1)/2; } printf("%lld\n",ans); return 0; }
以上是关于bzoj 1914: [Usaco2010 OPen]Triangle Counting 数三角形——极角排序的主要内容,如果未能解决你的问题,请参考以下文章
bzoj 1914: [Usaco2010 OPen]Triangle Counting 数三角形——极角排序
bzoj 1783: [Usaco2010 Jan]Taking Turns
BZOJ 2100 Usaco2010 Dec Apple Delivery
bzoj1827[Usaco2010 Mar]gather 奶牛大集会*