HDU 4380 预处理枚举

简介:

题意:给出n个房子m个矿问从n个房子选三个组成的三角形内部矿数为奇数有多少种选法。

先预处理一下每条线段正上方有多少个点,然后在枚举三条线段就可以了。

#include <iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
struct point
{
    long long x,y;
};
int cmp(point a,point b)
{
    return a.x<b.x;
}
long long Direction(point pi,point pj,point pk) //判断向量PiPj在向量PiPk的顺逆时针方向 +顺-逆0共线
{
    return (pj.x-pi.x)*(pk.y-pi.y)-(pk.x-pi.x)*(pj.y-pi.y);
}
long long yl[205][205];
point data[205],mine[1005];
int main()
{
    int t,n,m,ca=0;
    while(~scanf("%d%d",&n,&m))
    {
        memset(yl,0,sizeof(yl));
        for(int i=0; i<n; i++)
            scanf("%I64d%I64d",&data[i].x,&data[i].y);
        for(int i=0; i<m; i++)
            scanf("%I64d%I64d",&mine[i].x,&mine[i].y);
        sort(mine,mine+m,cmp);
        sort(data,data+n,cmp);
        for(int i=0; i<n; i++)       //预处理
            for(int j=i+1; j<n; j++)
                for(int k=0; k<m&&mine[k].x<data[j].x; k++)
                    if(mine[k].x>=data[i].x&&Direction(data[i],data[j],mine[k])>0)
                        yl[i][j]++;
        long long ans=0;
        for(int i=0; i<n; i++)
            for(int j=i+1; j<n; j++)
                for(int k=j+1; k<n; k++)
                {
                    long long q=yl[i][k]-yl[i][j]-yl[j][k];
                    if(q<0) q=-q;
                    if(q%2)
                        ans++;
                }
        printf("Case %d: ",++ca);
        printf("%I64d\n",ans);
    }
    return 0;
}


目录
相关文章
|
9月前
|
人工智能
【宽搜必备】康托展开(从公式解析到代码实现)
【宽搜必备】康托展开(从公式解析到代码实现)
37 0
|
5月前
|
存储 算法 vr&ar
☆打卡算法☆LeetCode 150. 逆波兰表达式求值 算法解析
☆打卡算法☆LeetCode 150. 逆波兰表达式求值 算法解析
|
5月前
|
机器学习/深度学习 算法 测试技术
C++前缀和算法的应用:向下取整数对和 原理源码测试用例
C++前缀和算法的应用:向下取整数对和 原理源码测试用例
|
6月前
|
编译器 C语言 C++
C语言--多组输入类题目
C语言--多组输入类题目
26 0
|
7月前
|
存储 算法 容器
精选算法题(1)——枚举符合要求的算术表达式(DFS、回溯法)
精选算法题(1)——枚举符合要求的算术表达式(DFS、回溯法)
|
11月前
|
C语言
C语言刷题系列——6.(递归)实现顺序输出整数
C语言刷题系列——6.(递归)实现顺序输出整数
176 0
|
算法 Go C++
leetcode-2321. 拼接数组的最大分数(差分+枚举)
但其实是在找两个数组之间[Left:Right]区间最大差值,差值我们自然而然的就可以想到差分,但是我们这里求的差分数组并不是两个数组前后元素的差值,而是两个数组同一下标的元素差值,这样我们只要找这段差分区间和的最大值就行了
50 0
leetcode-2321. 拼接数组的最大分数(差分+枚举)
蓝桥杯第八讲--枚举与模拟【例题】(二)
蓝桥杯第八讲--枚举与模拟【例题】
114 0
蓝桥杯第八讲--枚举与模拟【例题】(二)
|
算法 测试技术 C++
蓝桥杯第八讲--枚举与模拟【例题】(一)
蓝桥杯第八讲--枚举与模拟【例题】
102 0
蓝桥杯第八讲--枚举与模拟【例题】(一)
|
数据处理 C++
C/CPP基础练习题(一)运算符,判断
C/CPP基础练习题(一)运算符,判断
204 0
C/CPP基础练习题(一)运算符,判断