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,哈希模板+数学公式!的更多相关文章

  1. POJ 2002 Squares 哈希

    题目链接: http://poj.org/problem?id=2002 #include <stdio.h> #include <string.h> ; struct Has ...

  2. POJ 2002 Squares【值得摸索的一道二分+点旋转】

    id=2002">Squares 很好的一道二分,事实上本来我是没有思路的,看了基神的题解之后才似乎明确了点. 题意:给出最多有1000个点,问这些点能够组成多少个正方形 分析:先想想 ...

  3. POJ 2002 Squares 解题报告(哈希 开放寻址 & 链式)

    经典好题. 题意是要我们找出所有的正方形.1000点,只有枚举咯. 如图,如果我们知道了正方形A,B的坐标,便可以推测出C,D两点的坐标.反之,遍历所有点作为A,B点,看C,D点是否存在.存在的话正方 ...

  4. poj 2002 Squares 几何二分 || 哈希

    Squares Time Limit: 3500MS   Memory Limit: 65536K Total Submissions: 15137   Accepted: 5749 Descript ...

  5. POJ 2002 Squares 几何, 水题 难度: 0

    题目 http://poj.org/problem?id=2002 题意 已知平面内有1000个点,所有点的坐标量级小于20000,求这些点能组成多少个不同的正方形. 思路 如图,将坐标按照升序排列后 ...

  6. POJ 2002 Squares [hash]

    Squares Time Limit: 3500MS   Memory Limit: 65536K Total Submissions: 16631   Accepted: 6328 Descript ...

  7. POJ 2002 Squares 数学 + 必须hash

    http://poj.org/problem?id=2002 只能说hash比二分快很多.随便一个hash函数都可以完爆二分. 判断是否存在正方形思路如下: 1.枚举任意两个点,作为正方形的一条边,那 ...

  8. POJ 2002 Squares

    二分.... Squares Time Limit: 3500MS Memory Limit: 65536K Total Submissions: 14530 Accepted: 5488 Descr ...

  9. PKU 2002 Squares(二维点哈希+平方求余法+链地址法)

    题目大意:原题链接 给定平面上的N个点,求出这些点一共可以构成多少个正方形. 解题思路: 若正方形为ABCD,A坐标为(x1, y1),B坐标为(x2, y2),则很容易可以推出C和D的坐标.对于特定 ...

随机推荐

  1. 常用的 JavaScript 简写方法

    1.三元操作符 当想写 if...else 语句时,使用三元操作符来代替. const x = 20; let answer; if (x > 10) {    answer = 'is gre ...

  2. vue从入门到开发--2-基本结构

    1.App.vue 是根文件,所有的其他组件的执行均需要在此文件内导入并调用才能实现. import (导入其他组件) Test (其他组件的名字) from ‘./components/test’( ...

  3. org.apache.axis2.AxisFault: Service class XXXXX must have public as access Modifier解决方案

    使用Axis2工具生成客户端调用辅助类后,编写客户端调用代码运行时报错,完整错误信息如下: log4j:WARN No appenders could be found for logger (org ...

  4. 除虫记——有关WindowsAPI文件查找函数的一次压力测试

    作者:朱金灿 来源:http://blog.csdn.net/clever101 这里说的除虫是指排除bug的意思.今天排除了一个有意思的bug,其中的场景大致是这样的:现在你要统计一个文件夹下非隐藏 ...

  5. arcgis jsapi接口入门系列(2):图层基础操作

    //图层相关demo layerFun: function () { //获取地图的所有图层(不包括的图层类型:底图图层(basemaps)) let layers = this.map.layers ...

  6. org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'requestMappingHandlerMapping' defined in class path resource

    spring boot web项目运行时提示如下错误 org.springframework.beans.factory.BeanCreationException: Error creating b ...

  7. 按Esc键实现关闭窗体

    实现效果: 知识运用: KeyEventArgs类的KeyData属性 //获取KeyDown或KeyUp事件的键数据 public Keys KeyData {get;} 实现代码: private ...

  8. Jordan 标准型定理

    将学习到什么 就算两个矩阵有相同的特征多项式,它们也有可能不相似,那么如何判断两个矩阵是相似的?答案是它们有一样的 Jordan 标准型.   Jordan 标准型定理 这节目的:证明每个复矩阵都与一 ...

  9. 一张图看懂苹果MacBook所有屏幕分辨率

    苹果全新12寸超薄MacBook比曾经最薄的MacBook Air更薄,不过却配备了Retina视网膜显示屏.12英寸RetinaMacBook上的显示屏分辨率为2304*1440,虽然不如15寸和1 ...

  10. Zynq UltraScale+ MPSoC 多媒体应用

    消费者渴望更高的视频质量,推动了视频技术的发展.MPSoC 基于 Zynq-7000SoC ,包括一个可编程逻辑 (PL) 的桥接处理系统 (PS),但它在 Zynq UltraScale+ MPSo ...