BZOJ 1914 计算几何
思路:
我们可以算不合法的
如果三个点都在同一侧 就不合法..
用总方案数减掉就可以了
(有神奇的实现方法...)
//By SiriusRen #include <cmath> #include <cstdio> #include <algorithm> using namespace std; const int N=100500; int n;long long ans; struct Node{int x,y;double angle;}node[N]; bool operator<(Node a,Node b){return a.angle<b.angle;} long long operator*(Node a,Node b){return 1ll*a.x*b.y-1ll*a.y*b.x;} int main(){ scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d%d",&node[i].x,&node[i].y); node[i].angle=atan2(node[i].y,node[i].x); } sort(node+1,node+1+n); int cnt=0,r=1; for(int i=1;i<=n;i++){ while(r%n+1!=i&&node[i]*node[r%n+1]>0)r++,cnt++; ans-=1ll*cnt*(cnt-1)/2,cnt--; }printf("%lld\n",1ll*n*(n-1)*(n-2)/6+ans); }