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 }
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 }