本题是向量叉积的应用,应用向量叉积可以判断一个点是否在三角形内部。
向量积 axb =|a|*|b|*sin<a,b>
当b在a的逆时针方向,向量积是正数,反之,是负数。
由图可知三角形内部的点都在三角形边的同一侧。
可以结合此性质解决本题。
绿色和红色区域可以根据三角形行走的方向相消为0
#include#include #include #include #include using namespace std;typedef __int64 lld;const int INF=1000000000;struct P{ lld x,y; P(){}; P(lld x,lld y):x(x),y(y){}; P operator -(const P & b)const { P tmp(x-b.x,y-b.y); return tmp; }};lld cross(P a,P b){ return a.x*b.y-a.y*b.x;}P red[505],blue[505];int cnt[505][505];int main(){ int i,j,k; int N,M; lld x,y; memset(cnt,0,sizeof(cnt)); freopen("D:\\codeforces\\D. Triangles\\data\\20.in","r",stdin); freopen("D:\\codeforces\\D. Triangles\\data\\20.out","w",stdout); cin>>N>>M; assert(N>=0&&N<=500); assert(M>=0&&M<=500); for(i=0;i >x>>y; assert(x>=-INF&&x<=INF); assert(y>=-INF&&y<=INF); red[i]=P(x,y); } for(i=0;i >x>>y; assert(x>=-INF&&x<=INF); assert(y>=-INF&&y<=INF); blue[i]=P(x,y); } for(i=0;i red[j].x)continue; for(k=0;k =red[i].x&&blue[k].x 0) cnt[i][j]++; } cnt[j][i]=-cnt[i][j]; } } int ans=0; for(i=0;i