半径为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 2
0 y<=0
1 y<=0
2 y<=0
-2 y>=0
-1 y>=0
0 y>=0
Sample Output
2
Hint
最好避开浮点运算
中文题意就不解释了
一开始的思路:根据上下开两个数组,然后去重,进行组合数取反面。
然而编码能力不过关一直WA,只好照着God 王的码了一发又吃了精度的亏。
#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;
}