poj2002 哈希
| Time Limit: 3500MS | Memory Limit: 65536K | |
| Total Submissions: 17666 | Accepted: 6735 |
Description
the latter property, however, as a regular octagon also has this property.
So we all know what a square looks like, but can we find all possible squares that can be formed from a set of stars in a night sky? To make the problem easier, we will assume that the night sky is a 2-dimensional plane, and each star is specified by its x
and y coordinates.
Input
point. You may assume that the points are distinct and the magnitudes of the coordinates are less than 20000. The input is terminated when n = 0.
Output
Sample Input
4
1 0
0 1
1 1
0 0
9
0 0
1 0
2 0
0 2
1 2
2 2
0 1
1 1
2 1
4
-2 5
3 7
0 0
5 2
0
Sample Output
1
6
1
Source
先枚举两个点,通过数学公式得到另外2个点,使得这四个点可以成正方形。然后检查散点集中是否存在计算出来的那两个点,若存在,说明有一个正方形。
但这样的做法会使同一个正方形依照不同的顺序被枚举了四次。因此最后的结果要除以4.
已知: (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)
能够用向量坐标来证明 对角线上俩坐标已知求还有一条对角线坐标
标记点x y时,key = (x^2+y^2)%prime
解决的地址冲突的方法,我使用了 链地址法
#include<iostream> //1500K 1000MS
#include<cstdio>
#include<cstring>
#include<cmath>
#define F 19999 using namespace std; struct zuo
{
int x,y;
} p[20001];
struct node
{
int x,y;
node *next;
}*head[20001];
int n;
int KK(zuo p1)
{
int key=(p1.x*p1.x+p1.y*p1.y)%F;
return key;
}
int Build(int k) //建立
{
int key=KK(p[k]);
if(!head[key])
{
head[key]=new node;
head[key]->next=NULL;
node *q;
q=new node;
q->x=p[k].x;
q->y=p[k].y;
q->next=NULL;
head[key]->next=q;
}
else
{
node *q,*top;
top=head[key];
q=head[key]->next;
while(q)
{
q=q->next;
top=top->next;
}
q=new node;
q->next=NULL;
q->x=p[k].x;
q->y=p[k].y;
top->next=q;
}
return 0;
}
int Count(zuo p1,zuo p2) //统计
{
int key1=KK(p1);
int flag=0;
int key2=KK(p2);
if(head[key1]&&head[key2]) //推断p1,p2是否在哈希表里
{
node *q=head[key1];
while(q)
{
if(q->x==p1.x&&q->y==p1.y)
{
flag=1;
break;
}
q=q->next;
}
if(flag==0)
return 0;
else
{
node *q=head[key2];
while(q)
{
if(q->x==p2.x&&q->y==p2.y)
{
return 1;
}
q=q->next;
}
}
}
return 0;
}
int main()
{
while(~scanf("%d",&n))
{
memset(head,0,sizeof(head));
if(!n)
break;
for(int i=0; i<n; i++)
{
scanf("%d%d",&p[i].x,&p[i].y);
Build(i);
}
int num=0;
for(int i=0; i<n; i++)
{
for(int j=i+1; j<n; j++)
{
zuo p1,p2;
p1.x=p[i].x+(p[i].y-p[j].y);
p1.y=p[i].y-(p[i].x-p[j].x);
p2.x=p[j].x+(p[i].y-p[j].y);
p2.y=p[j].y-(p[i].x-p[j].x);
num+=Count(p1,p2); p1.x=p[i].x-(p[i].y-p[j].y);
p1.y=p[i].y+(p[i].x-p[j].x);
p2.x=p[j].x-(p[i].y-p[j].y);
p2.y=p[j].y+(p[i].x-p[j].x);
num+=Count(p1,p2);
}
}
printf("%d\n",num/4);
}
}
poj2002 哈希的更多相关文章
- poj2002 数正方形 (哈希+几何)
题目传送门 题目大意:给你一堆点,问你能组成几个正方形. 思路:一开始想的是用对角线的长度来当哈希的key,但判断正方形会太复杂,然后就去找了一下正方形的判断方法,发现 已知: (x1,y1) (x2 ...
- POJ2002 二分查找&哈希
问题重述: 给定整数n,以及n个点的坐标xi, yi.求这n个点可以组成的正方形的数目(每个点可重复使用). 分析: 根据正方形的性质,给定两个点就能确定可能构成的两个正方形的另外两个顶点.因此,只需 ...
- POJ-2002 Squares,哈希模板+数学公式!
Squares 题意:二维坐标轴给出n个点求有多少个正方形. 要是平时做比赛的话毫无疑问会 ...
- [PHP内核探索]PHP中的哈希表
在PHP内核中,其中一个很重要的数据结构就是HashTable.我们常用的数组,在内核中就是用HashTable来实现.那么,PHP的HashTable是怎么实现的呢?最近在看HashTable的数据 ...
- java单向加密算法小结(2)--MD5哈希算法
上一篇文章整理了Base64算法的相关知识,严格来说,Base64只能算是一种编码方式而非加密算法,这一篇要说的MD5,其实也不算是加密算法,而是一种哈希算法,即将目标文本转化为固定长度,不可逆的字符 ...
- Java 哈希表运用-LeetCode 1 Two Sum
Given an array of integers, find two numbers such that they add up to a specific target number. The ...
- 网络安全——Base64编码、MD5、SHA1-SHA512、HMAC(SHA1-SHA512)哈希
据说今天520是个好日子,为什么我想起的是502.500.404这些?还好服务器没事! 一.Base64编码 Base64编码要求把3个8位字节(3*8=24)转化为4个6位的字节(4*6=24),之 ...
- Oracle 哈希连接原理
<基于Oracle的sql优化>里关于哈希连接的原理介绍如下: 哈希连接(HASH JOIN)是一种两个表在做表连接时主要依靠哈希运算来得到连接结果集的表连接方法. 在Oracle 7.3 ...
- SQL连接操作符介绍(循环嵌套, 哈希匹配和合并连接)
今天我将介绍在SQLServer 中的三种连接操作符类型,分别是:循环嵌套.哈希匹配和合并连接.主要对这三种连接的不同.复杂度用范例的形式一一介绍. 本文中使用了示例数据库AdventureWorks ...
随机推荐
- [国家集训队]最长双回文串 (PAM)回文自动机
Code: // luogu-judger-enable-o2 #include <cstdio> #include <algorithm> #include <cstr ...
- 路飞学城Python-Day4(practise)
#1.请用代码实现:利用下划线将列表的每一个元素拼接成字符串,li = ['alex','eric','rain']# li = ['alex','eric','rain']# print('_'.j ...
- 前端换行显示,后端返回<br>
- li自定义图标
/*自定义list的图标*/ li{ list-style-image: url(../img/21.JPG); }
- input标签type为number时,输入小数,在Firefox浏览器上输入框标红的问题
问题一:firefox 下 默认情况 <input type="number"> 只允许输入整数,输入小数时会报错,输入框被标红 这时候可以添加参数 step=&q ...
- JS函数传参传入对象
例如: value为一个对象 value={} var valueStr = JSON.stringify(value); 对象转字符串 "<a style='cursor: poin ...
- POJ-1062 昂贵的聘礼 有限制的最短路
题目链接:https://cn.vjudge.net/problem/POJ-1062 题意 虽然是中文题,还是简单复述一下吧 我们想要酋长的女儿作为老婆.作为交换,酋长想要点钱. 酋长提出可以用其他 ...
- [六省联考2017]分手是祝愿(期望+DP)
题解 很容易想出来最优策略是什么. 就是从n到1看到开着的灯就把它关了 我们预处理出当前状态把灯全部关闭后的最少步数cnt 然后我们的主人公就要瞎按... 设dp[i]代表当前状态最优解为i步时走到d ...
- [Vijos P1369]难解的问题
题目大意:给你一个序列,叫你求最长上升子序列长度,但必须包含第k项. 解题思路:我们把k左边的比a[k]大的数去掉,k右边的比k小的数去掉,就可以保证选到a[k]了(因为左边的数小于a[k],而a[k ...
- 火狐添加消息头 Modify Header Value (HTTP Headers)
火狐浏览器添加组件 : Modify Header Value (HTTP Headers)