题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=115760#problem/A

  题目意思大致为由n个点(n小于100)和m个金矿(m小于1000),对于任意n点中每三个点都不会共线,对于n个点中每三个点构成的三角形中,金矿落在其中的个数为奇数时,这是符合题意的三角形,求共有多少个三角形满足题意。

  据说暴力枚举所有三角形然后枚举每个点是不是在其中(复杂度10^9)是可以过的,但不是正解。

  下面给出幻神的精彩思路:对于每两个点(复杂度n^2),枚举每一个点是不是在他们的下面,这个预处理的复杂度是10^7,得到每条边的下面的点的个数。然后枚举每三个三角形,对于这个三角形的,比方说,i,j,k按照它们的x坐标升序排列,且j点在edge(i,k)上,那么只要edge(i,j)边下的点的数目加上edge(j,k)边下的数目减去edge(i,k)边下的数目就是在这个三角形内的点的个数;另外如果j点在edge(i,k)下,那么只要反过来相减就可以了。综上,只要升序以后,取绝对值即可。另外的一个技巧是,只要给n个点按照x坐标的大小排序一下,代码写起来就会非常方便。但是这里有个坑点,因为边的权值是10的5次方级别的,所以在使用叉积判断点是否在边下的时候可能会爆int!所以做一题绝对不能大意啊- 。-

  AC代码如下:

 #include <stdio.h>
#include <string.h>
#include <algorithm>
#include <math.h>
using namespace std;
typedef long long ll; int cnt[][];
struct point
{
int x,y;
bool operator < (const point & A)const
{
return x<A.x;
}
}p[]; ll cross(point a,point b,point c)
{
ll x1=(ll)b.x-a.x;
ll y1=(ll)b.y-a.y;
ll x2=(ll)c.x-a.x;
ll y2=(ll)c.y-a.y;
return x1*y2-y1*x2;
}
int main()
{
int n,m;
int kase=;
while(scanf("%d%d",&n,&m)==)
{
memset(cnt,,sizeof(cnt));
for(int i=;i<=n;i++) scanf("%d%d",&p[i].x,&p[i].y);
for(int i=;i<=m;i++) scanf("%d%d",&p[i+n].x,&p[i+n].y); sort(p+,p++n);
for(int i=;i<=n-;i++)
for(int j=i+;j<=n;j++)
for(int k=n+;k<=n+m;k++)
{
if(p[j].x>p[k].x&&p[k].x>p[i].x && cross(p[i],p[j],p[k])<) cnt[i][j]++;
} int ans=;
for(int i=;i<=n-;i++)
for(int j=i+;j<=n-;j++)
for(int k=j+;k<=n;k++)
{
int t=abs(cnt[i][j]+cnt[j][k]-cnt[i][k]);
if(t&) ans++;
}
printf("Case %d: %d\n",++kase,ans);
}
return ;
}

  另外有仓鼠学长的思路是,枚举三边,上面的两边的下面和下面一边的上面存在的点取个交集就是这个三角形内部的点的个数,,觉得不如幻神的思路来得好,而且觉得写起来也麻烦,不过作为一种思路记下来总是好的- 。-

HDU 4380 Farmer Greedy(叉积和三角形知识的综合应用)的更多相关文章

  1. HDU 4380 Farmer Greedy 计算几何+bitset

    枚举直线,对于直线的某个点在直线的左端还是右端,能够状压出一个数.用bitset记录. 然后三角形就是3个bitset&一下 #include <cstdio> #include ...

  2. hdu 4709:Herding(叉积求三角形面积+枚举)

    Herding Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

  3. HDU 1176 免费馅饼 (类似数字三角形的题,很经典,值得仔细理解的dp思维)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1176 免费馅饼 Time Limit: 2000/1000 MS (Java/Others)     ...

  4. hdu 5312 Sequence(数学推导——三角形数)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5312 Sequence Time Limit: 2000/2000 MS (Java/Others)  ...

  5. hdu 6601 区间条件极值 - 区间 最大 三角形周长

    题目传送门//res tp hdu 目的 对长度为n的区间,给定q个子区间,求其元素能构成三角形的最大周长.有多组测试. n 1e5 q 1e5 ai [1,1e9] (i∈[1,n]); 数据结构 ...

  6. POJ - 1654 利用叉积求三角形面积 去 间接求多边形面积

    题意:在一个平面直角坐标系,一个点总是从原点出发,但是每次移动只能移动8个方向的中的一个并且每次移动距离只有1和√2这两种情况,最后一定会回到原点(以字母5结束),请你计算这个点所画出图形的面积 题解 ...

  7. hdu 4617 Weapon(叉积)

    大一学弟表示刚学过高数,轻松无压力. 我等学长情何以堪= = 求空间无限延伸的两个圆柱体是否相交,其实就是叉积搞一搞 详细点就是求两圆心的向量在两直线(圆心所在的直线)叉积上的投影 代码略挫,看他的吧 ...

  8. HDU 1176 免费馅饼(数字三角形)

    免费馅饼 Problem Description 都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼.说来gameboy的人品实在是太好了,这馅饼别处都不掉,就掉 ...

  9. (hdu step 7.1.6)最大三角形(凸包的应用——在n个点中找到3个点,它们所形成的三角形面积最大)

    题目: 最大三角形 Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

随机推荐

  1. 决心学HTML 第一晚

    老师数他的审美观不行,怕教的我们的审美观也不行,所以,就不讲HTML了,但是期末又要考, 自己英语又不行,期末做项目又要用,我可能又要做组长,只能硬着头皮自学了. 所以,现在从第一页开始学!!! 这这 ...

  2. VBA算术运算符

    以下是VBA支持算术运算符. 假设变量A=5,变量B=10,那么 - 运算符 描述 示例 + 两个操作数相加 A + B = 15 - 两个操作数相减 A - B = -5 * 两个操作数相乘 A * ...

  3. vue——store全局存储

    业务场景:刷新页面时,首次拉取所有配置,存储到store状态管理用于全局调用: import Vue from 'vue' import Vuex from 'vuex' import userInf ...

  4. 微信企业红包api接入

    项目描述:基于微信浏览器的H5页面,接入微信支付接口和微信红包接口 一.接入前准备条件 1.微信公众号 需要基于已认证的微信公众号承载该H5页面.该条件默认已具备,本文重点为红包接口. 2.微信支付商 ...

  5. CentOS7安装CDH 第六章:CDH的管理-CDH5.12

    相关文章链接 CentOS7安装CDH 第一章:CentOS7系统安装 CentOS7安装CDH 第二章:CentOS7各个软件安装和启动 CentOS7安装CDH 第三章:CDH中的问题和解决方法 ...

  6. 05 Windows编程——Windows程序框架

    源码 #include<Windows.h> LRESULT CALLBACK WindProc(HWND hwnd, UINT message, WPARAM wParam, LPARA ...

  7. 初级文件IO——IO过程、open、close、write、read、lseek、dup、dup2、errno、perror

    先要回答的问题 文件IO指的是什么? 本文主要讲述如何调用Linux OS所提供的相关的OS API,实现文件的读写. 如何理解文件IO? IO就是input output的意思,文件io就是文件输入 ...

  8. opengl 4.5 中文api 链接

    https://www.cnblogs.com/wiki3d/p/opengl_a.html

  9. js之head请求,闪电般实现交互

    平时我们用到的请求一般为post和get,今天介绍一种新的请求方式,head请求,顾名思义,head请求就是请求头部信息的,也只能请求头部信息,所以相应速度非常快,可以快速的实现前后端的交互 $.aj ...

  10. laravel本地开发环境的安装及配置 - Windows:安装 Laravel Homestead 虚拟机

    一.安装 VirtualBox-5.2.22-126460-Win.exe 和 vagrant_2.2.2_x86_64.msi(可视化安装包安装); 安装在D盘 二.导入 Homestead Vag ...