POJ-2002 Squares,哈希模板+数学公式!
题意:二维坐标轴给出n个点求有多少个正方形。
要是平时做比赛的话毫无疑问会想到用二分去写这道题,但毕竟出现在hash专题里,所以自然用hash去攻克,但是完全没有思路,于是,,网上找了题解,让我感叹的是我们做hash的题怎么知道用哪种hash函数呢。。这道题以坐标平方和再对hash数组大小取余,这样离散化感觉有点钻数据空子,但hash是有处理冲突的能力的,存在冲突怎么办呢,我们可以用链表的形式建立联系,直接在链表中查找就可以了。
用两层循环枚举然后在hash表中查找另外两个点是否存在,所以这题还有一个很重要的数学公式,那就是:
已知: (x1,y1) (x2,y2)
则: x3=x1+(y1-y2) y3= y1-(x1-x2)
x4=x2+(y1-y2) y4= y2-(x1-x2)
或
x3=x1-(y1-y2) y3= y1+(x1-x2)
x4=x2-(y1-y2) y4= y2+(x1-x2)
枚举两个点,根据上面的公式得出坐标,再根据坐标关系在hash表中查找。
struct hashmap
{
int x,y;
hashmap *next;
hashmap()
{
next=NULL;
}
}*h[N];
struct node
{
int x,y;
}a[N];
void insert(int x,int y)
{
int key=(x*x+y*y)%N;
if(!h[key])
{
hashmap *tmp=new hashmap();
tmp->x=x,tmp->y=y;
h[key]=tmp;
}
else
{
hashmap *tmp=h[key];
while(tmp->next) tmp=tmp->next;
tmp->next=new hashmap();
tmp->next->x=x,tmp->next->y=y;
}
}
bool find(int x,int y)
{
int key=(x*x+y*y)%N;
hashmap *tmp=h[key];
while(tmp)
{
if(tmp->x==x&&tmp->y==y) return true;
tmp=tmp->next;
}
return false;
}
int main()
{
int n;
while(~scanf("%d",&n)&&n)
{
memset(h,0,sizeof(h));
for(int i=0;i<n;i++)
{
scanf("%d%d",&a[i].x,&a[i].y);
insert(a[i].x,a[i].y);
}
int ans=0;
for(int i=0;i<n;i++)
for(int j=i+1;j<n;j++)
{
int x1=a[i].x+a[i].y-a[j].y,y1=a[i].y-a[i].x+a[j].x;
int x2=a[j].x+a[i].y-a[j].y,y2=a[j].y-a[i].x+a[j].x;
if(find(x1,y1)&&find(x2,y2)) ans++;
x1=a[i].x+a[j].y-a[i].y,y1=a[i].y+a[i].x-a[j].x;
x2=a[j].x+a[j].y-a[i].y,y2=a[j].y+a[i].x-a[j].x;
if(find(x1,y1)&&find(x2,y2)) ans++;
}
printf("%d\n",ans/4);
}
return 0;
}
POJ-2002 Squares,哈希模板+数学公式!的更多相关文章
- POJ 2002 Squares 哈希
题目链接: http://poj.org/problem?id=2002 #include <stdio.h> #include <string.h> ; struct Has ...
- POJ 2002 Squares【值得摸索的一道二分+点旋转】
id=2002">Squares 很好的一道二分,事实上本来我是没有思路的,看了基神的题解之后才似乎明确了点. 题意:给出最多有1000个点,问这些点能够组成多少个正方形 分析:先想想 ...
- POJ 2002 Squares 解题报告(哈希 开放寻址 & 链式)
经典好题. 题意是要我们找出所有的正方形.1000点,只有枚举咯. 如图,如果我们知道了正方形A,B的坐标,便可以推测出C,D两点的坐标.反之,遍历所有点作为A,B点,看C,D点是否存在.存在的话正方 ...
- poj 2002 Squares 几何二分 || 哈希
Squares Time Limit: 3500MS Memory Limit: 65536K Total Submissions: 15137 Accepted: 5749 Descript ...
- POJ 2002 Squares 几何, 水题 难度: 0
题目 http://poj.org/problem?id=2002 题意 已知平面内有1000个点,所有点的坐标量级小于20000,求这些点能组成多少个不同的正方形. 思路 如图,将坐标按照升序排列后 ...
- POJ 2002 Squares [hash]
Squares Time Limit: 3500MS Memory Limit: 65536K Total Submissions: 16631 Accepted: 6328 Descript ...
- POJ 2002 Squares 数学 + 必须hash
http://poj.org/problem?id=2002 只能说hash比二分快很多.随便一个hash函数都可以完爆二分. 判断是否存在正方形思路如下: 1.枚举任意两个点,作为正方形的一条边,那 ...
- POJ 2002 Squares
二分.... Squares Time Limit: 3500MS Memory Limit: 65536K Total Submissions: 14530 Accepted: 5488 Descr ...
- PKU 2002 Squares(二维点哈希+平方求余法+链地址法)
题目大意:原题链接 给定平面上的N个点,求出这些点一共可以构成多少个正方形. 解题思路: 若正方形为ABCD,A坐标为(x1, y1),B坐标为(x2, y2),则很容易可以推出C和D的坐标.对于特定 ...
随机推荐
- .net core API第一次试水
这是我第一个API 项目他比普通的.NET CORE APPLICATION要多一个controllers层和appsetting.json 我们主要研究一下流程是怎么样的 在我尝试着改变launch ...
- ACCESS中通过一个字段补齐更新另一个字段
[干货从下面红字开始] 搞了好久的一个问题终于有结果…… 根据学生进出馆的次数和学生报名人数来分配自习间 学生报名是通过工号(学号)来报名的: 而门禁系统统计出来的数据有绝一大部分仅有 卡号没有 工号 ...
- JS核心
JS核心 1.实例化对象 objectName = new objectType (param1 [,param2] ...[,paramN]) 参数 objectName 新对象实例的名称. ob ...
- 洛谷 P2916 [USACO08NOV]为母牛欢呼Cheering up the Cows
题目描述 Farmer John has grown so lazy that he no longer wants to continue maintaining the cow paths tha ...
- sql server 处理分母为空
SP 前面加下面设置,会忽略错误结果 直接返回null 不会导致SP 失败 SET ANSI_WARNINGS OFFSET ARITHABORT OFFSET ARITHIGNORE ON
- OS X快捷键小技巧
退出command+Q,关分页Command+W,刷新Command+R,新开分页Command+T 全屏 ctrl+command+F 每个Mac使用者都知道点击下窗口左上角黄色圆形的按钮就可以最小 ...
- js 两个数组对象根据账号比较去重,解决直接splice后数组索引改变
目的获取Arr2中不包含在arr1中的对象 根据Account进行比较,如果相等则删除tempArr数组对象. 结果返回张三 var arr1=[{"account":" ...
- HTML5触摸事件
touchstart .touchmove .touchend 事件 touchstart事件:当手指触摸屏幕时触发,即使有一个手指放在屏幕上也会触发. touchmove事件:当手指在屏幕上滑动时触 ...
- [LUOGU] P1049 装箱问题
题目描述 有一个箱子容量为V(正整数,0<=V<=20000),同时有n个物品(0<n<=30,每个物品有一个体积(正整数). 要求n个物品中,任取若干个装入箱内,使箱子的剩余 ...
- python 学习总结4
数字类型及操作 一.整数类型 (1)python中的整数与数学中的概念是一致的,可以正也可以负,没有取值范围. pow(x,y)函数是计算x的y次幂,想计算多大就多大. (2)在整数类型中有四种进 ...