HLG 1357 Leyni,罗莉和怪叔叔
题意: 有 n 个萝莉,和 m 个怪叔叔,已知他们的坐标,且任意三个人不共线,要求从萝莉中任选三个人出来,且三个人
组成的三角形中不能包含怪叔叔,共有多少种取法。
分析: 将萝莉的坐标按横坐标排序,用 f[i][j] 表示萝莉 i 到萝莉 j 的横坐标范围内,位于萝莉 i ,j上方的
怪叔叔数量,对于横坐标依次增加的 萝莉 i,j,k ,如果有
f[i][j]+f[j][k]=f[i][k], 则 萝莉 i,j,k 组成的三角形内不含有怪叔叔(画图能够看出)。
时间复杂度为 O(N^3)。
View Code
#include<stdio.h> #include<string.h> #include<stdlib.h> struct node { long long x,y; }l[204],g[204]; int cmp(const void*p1,const void*p2) { node* c=(node*)p1; node* d=(node*)p2; return c->x-d->x; } long long mul(node a,node b,node c) { return (b.x-a.x)*(c.y-a.y)-(b.y-a.y)*(c.x-a.x); } int f[202][202]; int main() { int n,m,t,i,j,k,tot; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); for(i=0;i<n;i++) scanf("%lld%lld",&l[i].x,&l[i].y); for(i=0;i<m;i++) scanf("%lld%lld",&g[i].x,&g[i].y); qsort(l,n,sizeof(l[0]),cmp); qsort(g,m,sizeof(g[0]),cmp); for(i=0;i<n-1;i++) for(j=i+1;j<n;j++) { tot=0; for(k=0;k<m;k++) if(g[k].x>=l[i].x&&g[k].x<=l[j].x&&mul(l[i],g[k],l[j])<0) tot++; f[i][j]=tot; } tot=0; for(i=0;i<n;i++) for(j=i+1;j<n;j++) for(k=j+1;k<n;k++) if(f[i][j]+f[j][k]==f[i][k]) tot++; printf("%d\n",tot); } return 0; }