POJ 2002 点hash
| Time Limit: 3500MS | Memory Limit: 65536K | |
| Total Submissions: 15489 | Accepted: 5864 |
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
二维平面给定一堆点,求能够组成正方形的个数,点数为1000。因此不能枚举四个点推断。
比較优化的方法是将全部点hash。然后枚举两个点,计算出另外两个点的坐标,然后在hash表里查找,最后结果除以4,由于每一条边被统计了4次。
代码:
/* ***********************************************
Author :_rabbit
Created Time :2014/5/11 8:26:00
File Name :20.cpp
************************************************ */
#pragma comment(linker, "/STACK:102400000,102400000")
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
#include <string>
#include <time.h>
#include <math.h>
#include <queue>
#include <stack>
#include <set>
#include <map>
using namespace std;
#define INF 0x3f3f3f3f
#define eps 1e-8
#define pi acos(-1.0)
typedef long long ll;
const int maxn=100009;
class HASH{
public:
struct Node{
int next,to;
Node(int _next=0,int _to=0){
next=_next;to=_to;
}
}edge[10010];
int tol,head[maxn+10];
void clear(){
memset(head,-1,sizeof(head));tol=0;
}
void add(int x,int y){
if(find(x,y))return;
int t=(x+maxn)%maxn;
edge[tol]=Node(head[t],y);
head[t]=tol++;
}
int find(int x,int y){
int t=(x+maxn)%maxn;
for(int i=head[t];i!=-1;i=edge[i].next)
if(edge[i].to==y)
return 1;
return 0;
}
}mi;
int x[1010],y[1010];
int main()
{
//freopen("data.in","r",stdin);
//freopen("data.out","w",stdout);
int n;
while(~scanf("%d",&n)&&n){
mi.clear();
for(int i=0;i<n;i++){
scanf("%d%d",&x[i],&y[i]);
mi.add(x[i],y[i]);
// cout<<"hhh "<<endl;
}
ll ans=0;
for(int i=0;i<n;i++)
for(int j=i+1;j<n;j++){
// cout<<"ddd"<<endl;
ll x3,y3,x4,y4;
x3=x[i]+(y[j]-y[i]);y3=y[i]-(x[j]-x[i]);
x4=x[j]+(y[j]-y[i]);y4=y[j]-(x[j]-x[i]);
if(mi.find(x3,y3)&&mi.find(x4,y4))ans++;
x3=x[i]-(y[j]-y[i]);y3=y[i]+(x[j]-x[i]);
x4=x[j]-(y[j]-y[i]);y4=y[j]+(x[j]-x[i]);
if(mi.find(x3,y3)&&mi.find(x4,y4))ans++;
// cout<<"ddd"<<endl;
}
ans/=4;
cout<<ans<<endl;
}
return 0;
}
版权声明:本文博客原创文章,博客,未经同意,不得转载。
POJ 2002 点hash的更多相关文章
- POJ 2002 Squares [hash]
Squares Time Limit: 3500MS Memory Limit: 65536K Total Submissions: 16631 Accepted: 6328 Descript ...
- POJ 2002 几何+hash
题目大意: 给定1000个点,寻找有多少组四点对能组成正方形 这里的题目跟上一道做的找平行四边形类似但想法却又不相同的方法 这里找任意2个点形成的一条边,那么可以根据这两个点,找到能和他们组成正方形剩 ...
- POJ 2002 统计正方形 HASH
题目链接:http://poj.org/problem?id=2002 题意:给定n个点,问有多少种方法可以组成正方形. 思路:我们可以根据两个点求出对应正方形[有2个一个在两点左边,一个在两点右边] ...
- POJ 2002 Squares 数学 + 必须hash
http://poj.org/problem?id=2002 只能说hash比二分快很多.随便一个hash函数都可以完爆二分. 判断是否存在正方形思路如下: 1.枚举任意两个点,作为正方形的一条边,那 ...
- Squares - poj 2002(hash)
枚举两个点作为一条边,求出正方形的另外两个点,利用hash查找另外两个点. #include<stdio.h> #include<string.h> #include<s ...
- poj 2002(好题 链式hash+已知正方形两点求另外两点)
Squares Time Limit: 3500MS Memory Limit: 65536K Total Submissions: 18493 Accepted: 7124 Descript ...
- POJ 2549 二分+HASH
题目链接:http://poj.org/problem?id=2002 题意:给定一个n个数字组成的序列,然后求出4个数使得a+b+c=d,求d的最大值.其中a,b,c,d要求是给定序列的数,并且不能 ...
- POJ 2002 Squares 哈希
题目链接: http://poj.org/problem?id=2002 #include <stdio.h> #include <string.h> ; struct Has ...
- POJ 1200 字符串HASH
题目链接:http://poj.org/problem?id=1200 题意:给定一个字符串,字符串只有NC个不同的字符,问这个字符串所有长度为N的子串有多少个不相同. 思路:字符串HASH,因为只有 ...
随机推荐
- 基本HTML5文件结构
作者 : Dolphin 原文地址:http://blog.csdn.net/qingdujun/article/details/28129039 基本HTML5文件结构: <!--<!D ...
- Oracle左连接、右连接示例
建表: create table a ( id ), name ) ); create table b ( name ), age ) ); create table c ( name ), dept ...
- 以&运行在后台的程序,关闭terminal后,相应进进程自动关闭
以&运行在后台的程序,关闭terminal后,相应进进程自动关闭
- js传真实地址 C:\fakepath
js给action传真是地址的时候,处于安全,传到action中 浏览器会改变路径变为C:\fakepath\ftp.txt,但是原始路径却是 C:\Documents and Settings\Ad ...
- jsp中将后台传递过来的json格式的list数据绑定到下拉菜单select
<span style="white-space:pre"> </span> <select><c:forEach var="f ...
- 七个你无法忽视的Git使用技巧(转)
与其他技术相比,Git应该拯救了更多开发人员的饭碗.只要你经常使用Git保存自己的工作,你就一直有机会可以将代码退回到之前的状态,因此就可以挽回那些你深夜里迷迷糊糊犯下的错误. 尽管这么说,Git的命 ...
- Swift - 操作表(UIActionSheel)的用法,也叫底部警告框
1,下面创建一个操作表(或叫底部警告框)并弹出显示 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 class ViewController: UIViewC ...
- OleContainer操作Excel以二进制方式读写数据库
需求源头:OleContainer操作Excel,想把Excel以二进制方式存入数据库,并且以二进制方式读取存入流:Procedure SaveToStream(ADOTable1: TAdoTabl ...
- Java方法区和运行时常量池溢出问题分析(转)
运行时常量池是方法区的一部分,方法区用于存放Class的相关信息,如类名.访问修饰符.常量池.字段描述.方法描述等. String.intern()是一个native方法,它的作用是:如果字符串常量池 ...
- BestCoder Round #3HDU 4907
1. HDU 4907:http://acm.hdu.edu.cn/showproblem.php?pid=4907 中文题我就不说题意了,直接说解题思路吧! ① 第一种思路就是我比赛时的思路,将a数 ...