题目大意:

给定1000个点,寻找有多少组四点对能组成正方形

这里的题目跟上一道做的找平行四边形类似但想法却又不相同的方法

这里找任意2个点形成的一条边,那么可以根据这两个点,找到能和他们组成正方形剩下的两个点的位置,根据hash表去搜索,如果这两个位置存在自己需要的点,说明这种方案可行

添加查找均交给hash表,这样可以实现O(n*n)的复杂度

最后因为每个正方形因为有4条边被访问了4次,所以总的答案要除以4

 #include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std;
#define N 1010
#define MOD 1000007
int head[MOD+] , k; struct Point{
int x , y;
Point(int x= , int y=):x(x),y(y){}
bool operator==(const Point &m)const{
return x==m.x&&y==m.y;
}
void input(){scanf("%d%d" , &x , &y);}
void print(){cout<<x<<" "<<y<<endl;}
}p[N]; struct HashNode{
int id , next;
}_hash[N]; void insert(int i)
{
int v = (p[i].x*p[i].x+p[i].y*p[i].y)%MOD;
_hash[k].id = i , _hash[k].next = head[v];
head[v] = k++;
} bool find(Point a)
{
int v = (a.x*a.x+a.y*a.y)%MOD;
for(int i=head[v] ; ~i ; i=_hash[i].next){
if(p[_hash[i].id] == a) return true;
}
return false;
} int main()
{
#ifndef ONLINE_JUDGE
freopen("a.in" , "r" , stdin);
#endif // ONLINE_JUDGE
int n;
while(scanf("%d" , &n) , n)
{
memset(head , - , sizeof(head));
k = ;
for(int i= ; i<=n ; i++){
p[i].input();
insert(i);
}
int ret = ;
for(int i= ; i<=n ; i++){
for(int j=i+ ; j<=n ; j++){
int dy = p[j].y-p[i].y;
int dx = p[j].x-p[i].x;
Point p1 = Point(p[i].x+dy , p[i].y-dx);
Point p2 = Point(p[j].x+dy , p[j].y-dx);
if(find(p1) && find(p2)) ret++;
p1 = Point(p[i].x-dy , p[i].y+dx);
p2 = Point(p[j].x-dy , p[j].y+dx);
if(find(p1) && find(p2)) ret++;
}
}
printf("%d\n" , ret/);
}
}

POJ 2002 几何+hash的更多相关文章

  1. POJ 2002 点hash

    Squares Time Limit: 3500MS   Memory Limit: 65536K Total Submissions: 15489   Accepted: 5864 Descript ...

  2. POJ 2002 Squares [hash]

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

  3. POJ 2002 统计正方形 HASH

    题目链接:http://poj.org/problem?id=2002 题意:给定n个点,问有多少种方法可以组成正方形. 思路:我们可以根据两个点求出对应正方形[有2个一个在两点左边,一个在两点右边] ...

  4. POJ 2002 Squares 数学 + 必须hash

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

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

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

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

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

  7. Squares - poj 2002(hash)

    枚举两个点作为一条边,求出正方形的另外两个点,利用hash查找另外两个点. #include<stdio.h> #include<string.h> #include<s ...

  8. poj 2002(好题 链式hash+已知正方形两点求另外两点)

    Squares Time Limit: 3500MS   Memory Limit: 65536K Total Submissions: 18493   Accepted: 7124 Descript ...

  9. POJ 2549 二分+HASH

    题目链接:http://poj.org/problem?id=2002 题意:给定一个n个数字组成的序列,然后求出4个数使得a+b+c=d,求d的最大值.其中a,b,c,d要求是给定序列的数,并且不能 ...

随机推荐

  1. DNS正、反向解析+负载均衡+智能DNS+密钥认证

    主机名 IP 软件包 系统版本 内核版本 实验环境 master 192.168.30.130 bind.x86_64 32:9.8.2-0.17.rc1.el6_4.6 bind-chroot.x8 ...

  2. Elasticsearch (2) - 映射

    常用映射类型 核心的字段类型如下: String 字符串包括text和keyword两种类型: 1.text analyzer 通过analyzer属性指定分词器. 下边指定name的字段类型为tex ...

  3. datetime 模块详解

    1.import datetime 常用方法: ttimedelta() 括号里默认为days,进行别的单位运算可以加上如hours = 1这样.除了进行减法运算,还可以进行加法运算. >> ...

  4. xcopy递归拷贝

    递归拷贝 ::xcopy SOURCE_DIR DES_DIR\ /s SOURCE_DIR后面不需要加反斜杠

  5. 我来解数独(附delphi源码)

    前段时间看到“69岁农民3天破解世界最难数独游戏”,然后在看了那个号称世界最难的数独题目之后,就打算抽空编程解决.今晚抽出一个晚上,大约四五个小时的时间,中间还间歇在clash of clans上造兵 ...

  6. 基于jmeter和shell的接口性能自动化

    基于jmeter和shell的接口性能自动化 1. 总体需求 由于性能测试中涉及的查询接口多,版本迭代频繁,版本更新后自动跑一轮查询业务的性能,可以及时发现一些开发修复bug触发的非预期的bug,利用 ...

  7. js函数中获得当前被点击元素

    问题描述:在html页面中点击<a>或者’按钮‘,进入js中的函数,在js函数中获得被点击那个<a>或‘按钮’元素 解决方法:方法一: html中: <a>标签:& ...

  8. django URL,views,html请求顺序

    进来的请求转入/hello/.   Django通过在ROOT_URLCONF配置来决定根URLconf.     Django在URLconf中的所有URL模式中,查找第一个匹配/hello/的条目 ...

  9. github下拉刷新与上拉加载地址

    https://github.com/chrisbanes/Android-PullToRefresh

  10. ie8兼容性

    ie8下不支持css的nth-child()样式解决方法一:使用jQuery的nth-child()方法例:$(".ability-head-list ul li:nth-child(1) ...