FZU 2242 Daxia like acute triangle

来源:互联网 发布:大学毕业后悔做程序员 编辑:程序博客网 时间:2024/06/09 18:52

半径为r的圆上有n个不重复的点,请你帮daxia计算这些点能构成多少个不同的锐角三角形.

Input

测试包含多组数据,每组数据第一行包含两个整数:n(1<=n<=20000),r(1<=r<=20000).

接下来包含n行,每行包含一个整数x(-r<=x<=r)和一个不等式"y<=0"或"y>=0".

Output

每组数据输出一行一个整数表示锐角三角形的总个数.

Sample Input
6 20 y<=01 y<=02 y<=0-2 y>=0-1 y>=00 y>=0
Sample Output
2
Hint
直接计算锐角三角形的个数比较困难,所以考虑反面,用全部的三角形减去直角和钝角的就是答案。
#include<cstdio>#include<iostream>#include<algorithm>using namespace std;const int N=1e5+10;int n,m;char s[N];struct point{int x,y;point(int x=0,int y=0):x(x),y(y){}bool operator<(const point&a)const{return y==a.y?x*y>a.x*y:y>a.y;}}a[N];int main(){while (~scanf("%d%d",&n,&m)){for (int i=1;i<=n;i++){scanf("%d%s",&a[i].x,s);if (s[1]=='<') a[i].y=-1; else a[i].y=1;}sort(a+1,a+n+1);long long ans=1LL*n*(n-1)*(n-2)/6;for (int i=1;i<=n;i++){if (a[i].y==1){int r=upper_bound(a+1,a+n+1,point(-a[i].x,-a[i].y))-a-i-1;ans-=1LL*r*(r-1)/2;}else {int r=upper_bound(a+1,a+n+1,point(-a[i].x,-a[i].y))-a-1+n-i;ans-=1LL*r*(r-1)/2;}}cout<<ans<<endl;}return 0;}

1 0
原创粉丝点击