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. 先看这个明白拉链法(链地址法),这个带源码,很好看懂,只不 ...
随机推荐
- 单引號转义符q’的使用
当字符串包括单引號时,能够使用转义符q'对单引號进行转义. q'后面的字符能够是: ! [ ] { } ( ) < > 前提是这些字符不会出如今兴许 ...
- [转]seajs详解
[转]seajs详解 SeaJS 是一个遵循commonJS规范的javascript模块加载框架,可以实现javascript的模块化开发和模块化加载(kk:模块可按需加载或全部加载). SeaJS ...
- 自定义View总结
写的很好,代你分析原码,关于 View Measure 测量机制,让我一次把话说完
- Spring JDBC样例
这里介绍一下通过Spring JDBC的方式进行数据库的增删改查的操作.在进行程序的编写之前我们需要在本地MySQL数据库中创建一张User表,如下所示: create database user_d ...
- Ubuntu16.04最快捷搭建小型局域网Git服务器
导读 使用linux操作系统,不得不提Git版本管理器,这个Linus花了两周时间开发的分布式版本管理器(这就是大神,先膜了个拜...),毫无疑问,Git版本管理器与linux系统有着与生俱来的同一血 ...
- WCF入门(十)——服务对象模型
当发生一次WCF请求-响应操作时,会经过如下几个步骤 WCF Client想WCF Server发送一个服务请求 WCF Server创建WCF服务对象 WCF Server调用WCF服务对象接口,将 ...
- 【BZOJ2699】更新 动态规划
[BZOJ2699]更新 Description 对于一个数列A[1..N],一种寻找最大值的方法是:依次枚举A[2]到A[N],如果A[i]比当前的A[1]值要大,那么就令A[1]=A ...
- 【BZOJ3648】寝室管理 树分治
[BZOJ3648]寝室管理 Description T64有一个好朋友,叫T128.T128是寄宿生,并且最近被老师叫过去当宿管了.宿管可不是一件很好做的工作,碰巧T128有一个工作上的问题想请T6 ...
- Android遍历SqlLite cursor对象:
//1. Cursor c =...; for(c.moveToFirst(); ! c.isAfterLast(); c.moveToNext()){ //c… } //2. Cursor curs ...
- Ubuntu16.4下RStudio1.1.447 中文输入问题的解决方案
Ubuntu16.4下RStudio1.1.447 中文输入问题的解决方案参照:https://blog.csdn.net/matteoshenl/article/details/78603528 R ...