PKU 2002 Squares(二维点哈希+平方求余法+链地址法)
题目大意:原题链接
给定平面上的N个点,求出这些点一共可以构成多少个正方形。
解题思路:
若正方形为ABCD,A坐标为(x1, y1),B坐标为(x2, y2),则很容易可以推出C和D的坐标。对于特定的A和B坐标,C和D可以在线段AB的上面或者下面,即有两种情况。
根据构造三角形全等可以得知(很简单,注意下细节,不要把坐标弄混就行)
CD在AB上面x3=x2+(y1-y2),y3=y2+(x2-x1); x4=x1+(y1-y2),y4=y1+(x2-x1);
CD在AB下面x3=x2-(y1-y2),y3=y2-(x2-x1); x4=x1-(y1-y2),y4=y1-(x2-x1);
因此只需要枚举点A和点B,然后计算出两种对应的C和D的坐标,判断是否存在即可。这样计算完之后得到的答案是正确答案的4倍,因为正方形的4条边都枚举了,所以答案要右移两位
Insert(int x,int y)采用平方求余法构造哈希函数,链地址法(用类邻接表法实现)处理冲突进行哈希
Judge(int x,int y)通过查找判断CD两点是否同时存在,即能判断是否可以构成正方形
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=;
const int N=;
int px[maxn],py[maxn];
struct Node
{
int x,y;
int next;
}node[N];
long long ans;
int n,cur,Hash[N]; void Insert(int x,int y)
{
int h=(x*x+y*y)%N;
node[cur].x=x;
node[cur].y=y;
node[cur].next=Hash[h];
Hash[h]=cur++;
}
bool Judge(int x,int y)
{
int h=(x*x+y*y)%N;
int next=Hash[h];
while(next!=-){
if(x==node[next].x&&y==node[next].y)
return true;
next=node[next].next;
}
return false;
} int main()
{
while(cin>>n,n){
memset(Hash,-,sizeof(Hash));
cur=,ans=;
for(int i=;i<n;i++){
cin>>px[i]>>py[i];
Insert(px[i],py[i]);
}
for(int i=;i<n;i++){//先枚举考虑CD在AB上面
for(int j=i+;j<n;j++){
int x3=px[j]+(py[i]-py[j]);
int y3=py[j]+(px[j]-px[i]);
int x4=px[i]+(py[i]-py[j]);
int y4=py[i]+(px[j]-px[i]);
if(Judge(x3,y3)&&Judge(x4,y4)) ans++;
}
}
for(int i=;i<n;i++){//再枚举考虑CD在AB下面
for(int j=i+;j<n;j++){
int x3=px[j]-(py[i]-py[j]);
int y3=py[j]-(px[j]-px[i]);
int x4=px[i]-(py[i]-py[j]);
int y4=py[i]-(px[j]-px[i]);
if(Judge(x3,y3)&&Judge(x4,y4)) ans++;
}//要判断C点和D点同时存在才能构成正方形
}
ans>>=;
printf("%lld\n",ans);
}
}
PKU 2002 Squares(二维点哈希+平方求余法+链地址法)的更多相关文章
- java 解决Hash(散列)冲突的四种方法--开放定址法(线性探测,二次探测,伪随机探测)、链地址法、再哈希、建立公共溢出区
java 解决Hash(散列)冲突的四种方法--开放定址法(线性探测,二次探测,伪随机探测).链地址法.再哈希.建立公共溢出区 标签: hashmaphashmap冲突解决冲突的方法冲突 2016-0 ...
- Java 二维数组,排序、切换顺序,查表法二进制十进制,这班查找、排序(冒泡、选择)、遍历,获取最大小值(4)
Java 二维数组,排序.切换顺序,查表法二进制十进制,折半查找.排序(冒泡.选择).遍历,获取最大小值(4)
- C# Dictionary源码剖析---哈希处理冲突的方法有:开放定址法、再哈希法、链地址法、建立一个公共溢出区等
C# Dictionary源码剖析 参考:https://blog.csdn.net/exiaojiu/article/details/51252515 http://www.cnblogs.com/ ...
- SWUST OJ 1012哈希表(链地址法处理冲突)
哈希表(链地址法处理冲突) 1000(ms) 10000(kb) 2676 / 6911 采用除留余数法(H(key)=key %n)建立长度为n的哈希表,处理冲突用链地址法.建立链表的时候采用尾插法 ...
- URAL - 1486 Equal Squares 二维哈希+二分
During a discussion of problems at the Petrozavodsk Training Camp, Vova and Sasha argued about who o ...
- poj-3739. Special Squares(二维前缀和)
题目链接: I. Special Squares There are some points and lines parellel to x-axis or y-axis on the plane. ...
- UVA - 11019 Matrix Matcher (二维字符串哈希)
给你一个n*m的矩阵,和一个x*y的模式矩阵,求模式矩阵在原矩阵中的出现次数. 看上去是kmp在二维情况下的版本,但单纯的kmp已经无法做到了,所以考虑字符串哈希. 类比一维情况下的哈希算法,利用容斥 ...
- POJ 2002 Squares 解题报告(哈希 开放寻址 & 链式)
经典好题. 题意是要我们找出所有的正方形.1000点,只有枚举咯. 如图,如果我们知道了正方形A,B的坐标,便可以推测出C,D两点的坐标.反之,遍历所有点作为A,B点,看C,D点是否存在.存在的话正方 ...
- Java解决Hash(散列)冲突的四种方法--开放地址法(线性探测,二次探测,伪随机探测)、链地址法、再哈希、建立公共溢出区
最近时间有点紧,暂时先放参考链接了,待有时间在总结一下: 查了好多,这几篇博客写的真心好,互有优缺点,大家一个一个看就会明白了: 参考 1. 先看这个明白拉链法(链地址法),这个带源码,很好看懂,只不 ...
随机推荐
- Java并发编程从入门到精通 张振华.Jack --我的书
[当当.京东.天猫.亚马逊.新华书店等均有销售] 目 录 第一部分:线程并发基础 第1章 概念部分 1 1.1 CPU核心数.线程数 (主流cpu.线程数的大体情况说一下) 1 1.2 CPU时间 ...
- 【BZOJ3585/3339】mex 莫队算法+分块
[BZOJ3585]mex Description 有一个长度为n的数组{a1,a2,...,an}.m次询问,每次询问一个区间内最小没有出现过的自然数. Input 第一行n,m. 第二行为n个数. ...
- angular4 在页面跳转的时候传递多个参数到新页面
页面跳转 router.navigate //单一参数: this.router.navigate(['/detail',id]); //多个参数: this.router.navigate(['/d ...
- requireJs官方使用教程(转)
原文地址:http://www.requirejs.cn § 1.使用 § 1.1 加载 JavaScript 文件 RequireJS的目标是鼓励代码的模块化,它使用了不同于传统<script ...
- 区分兼容IE6/IE7/IE8/IE9/FF的CSS HACK写法
HACK原理:不同浏览器对各中字符的识别不同 在 CSS中常用特殊字符识别表: (1)*: IE6+IE7都能识别*,而标准浏览器FF+IE8是不能识别*的; (2)!important: 除IE6 ...
- java前后台开发之后台自动上传下载
package downloadTest; import java.io.BufferedReader; import java.io.File; import java.io.FileInputSt ...
- linux 定时备份mysql数据库
首先要先搞清楚两个概念: ①.mysqldump,mysqldump是mysql的逻辑备份工具,它不是linux的命令,工作原理类似产生一些列sql语句,对数据库进行指定的逻辑备份. 最简洁的形式是: ...
- Ubuntu 16.04修改配置静态IP和DNS
Ubuntu 16.04修改配置静态IP和DNS 1.修改interfaces 文件 sudo gedit /etc/network/interfaces 2.添加 例如: auto enp0s25 ...
- java拾遗4----一个简单java程序的运行全过程
简单说来,一个java程序的运行需要编辑源码.编译生成class文件.加载class文件.解释或编译运行class中的字节码指令. 下面有一段简单的java源码,通过它来看一下java程序的运行流程: ...
- 20165330 2017-2018-2 《Java程序设计》第5周学习总结
课本知识总结 第七章 内部类与异常类 内部类:类的一种成员 外嵌类:包含内部类的类称为内部类的外嵌类 二者关系: 内部类的外嵌类的成员变量在内部类中仍然有效,内部类中的方法也可以调用外嵌类中的方法. ...