Little Petya likes to draw. He drew N red and M blue points on the plane in such a way that no three points lie on the same line. Now he wonders what is the number of distinct triangles with vertices in red points which do not contain any blue point inside.
Input
The first line contains two non-negative integer numbers N and M (0 ≤ N ≤ 500, 0 ≤ M ≤ 500) — the number of red and blue points respectively. The following N lines contain two integer numbers each — coordinates of red points. The following M lines contain two integer numbers each — coordinates of blue points. All coordinates do not exceed 109 by absolute value.
Output
Output one integer — the number of distinct triangles with vertices in red points which do not contain any blue point inside.
Examples
Input
4 10 010 010 105 42 1
Output
2
Input
5 55 106 18 6-6 -77 -15 -110 -4-10 -8-10 5-2 -8
Output
7
向量法:这里写得很明了了:https://blog.csdn.net/v5zsq/article/details/79687164。。。(我还是太菜了
#include<bits/stdc++.h> #define ll long long #define rep(i,a,b) for(int i=a;i<=b;i++) using namespace std; const int maxn=510; struct point{ int x,y; point(){} }a[maxn],b[maxn]; ll det(point O,point A,point B){ return (1LL*A.x-O.x)*(B.y-O.y)-(1LL*B.x-O.x)*(A.y-O.y); } int dp[maxn][maxn]; int main() { int N,M,ans=0; scanf("%d%d",&N,&M); a[0].x=-1e9-1; a[0].y=-1e9-1; rep(i,1,N) scanf("%d%d",&a[i].x,&a[i].y); rep(i,1,M) scanf("%d%d",&b[i].x,&b[i].y); rep(i,1,N) rep(j,1,N){ if(i==j||det(a[0],a[i],a[j])<0) continue; rep(k,1,M) if(det(a[0],a[j],b[k])<=0&&det(a[j],a[i],b[k])<=0&&det(a[i],a[0],b[k])<=0) dp[i][j]++; dp[j][i]=-dp[i][j]; } rep(i,1,N) rep(j,i+1,N) rep(k,j+1,N) ans+=(dp[i][j]+dp[j][k]+dp[k][i]==0); printf("%d\n",ans); return 0; }
原文地址:https://www.cnblogs.com/hua-dong/p/9626641.html