hdu 4380 Farmer Greedy (计算几何 2012 Multi-University Training Contest 9 )

http://acm.hdu.edu.cn/showproblem.php?pid=4380

 题意:  给出 n个房子的位置 。和 m个 金矿的位置 ,从  n 个房子里选出三个(组成三角形),求出有多少种选法 是 三角形 内的金矿数为 奇数?

 

题解:

 预处理  枚举 从 n 个房子里 选出 2个i,j 记录 在其上方的 金矿数dp[i][j],枚举所有的三角形 那么 三角形 内的点为  fabs(dp[i][k] - dp][i][j] - dp[j][k]);

 

 

 

 

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<cmath>
 4 #include<iostream>
 5 #include<algorithm>
 6 #include< set>
 7 #include<map>
 8 #include<queue>
 9 #include<vector>
10 #include< string>
11  #define Min(a,b) a<b?a:b
12  #define Max(a,b) a>b?a:b
13  #define CL(a,num) memset(a,num,sizeof(a));
14  #define maxn  120
15  #define eps  1e-8
16  #define inf 100000000
17  #define mx 1<<60
18  #define ll   __int64
19  using  namespace std;
20  struct house
21 {
22      double  x;
23      double y;
24 }a[maxn],b[maxn *  10];
25  int cmp(house a,house b)
26 {
27      if(a.x == b.x)  return a.y < b.y ;
28      else   return a.x < b.x ;
29 }
30  double   in(house a,house b,house c)
31 {
32       return (b.x-a.x)*(c.y-a.y)-(b.y-a.y)*(c.x-a.x);
33 }
34 
35  int dp[maxn][maxn] ;
36  int main()
37 {
38      int n,m,i,j,k;
39       int cas =  0;
40      while(scanf( " %d%d ",&n,&m)!=EOF)
41     {
42 
43          for(i =  0; i < n;i++)
44          {
45              scanf( " %lf%lf ",&a[i].x,&a[i].y);
46          }
47          sort(a,a + n,cmp);
48           for(i =  0; i < m;i++)
49          {
50              scanf( " %lf%lf ",&b[i].x,&b[i].y);
51          }
52 
53           for(i =  0 ; i < n  ;i++)
54          {
55               for(j = i +  1; j < n;j++)
56              {
57 
58                  dp[i][j] =  0;
59                   for(k =  0;k < m;k++)
60                  {
61                      if(b[k].x >= a[i].x && b[k].x < a[j].x )//注意 右边要是开区间 (以免重减)
62                          if( in(a[i],a[j],b[k]) >  0) dp[i][j]++;
63                  }
64 
65              }
66          }
67           int  ans =  0;
68           for(i =  0 ; i < n  ;i++)
69          {
70               for(j = i +  1 ;j < n  ;j++)
71              {
72                   for(k = j +  1; k < n ;k++)
73                  {
74 
75                     int  tmp = abs(dp[i][k] - dp[i][j] - dp[j][k]) ;
76 
77                     if(tmp& 1) ans ++;
78 
79                  }
80              }
81          }
82         printf( " Case %d: %d\n ", ++cas, ans);
83 
84     }
85 }

 

 

 

 

 

 

 

 

你可能感兴趣的:(test)