正方形个数(二维点哈希)
题目:http://poj.org/problem?id=2002
题意:平面上给定n个点,求由这些点能构成多少个正方形。
分析:我们枚举两个点,那么在这两个点形成的直线两边可以计算出正方形的另外两个点,利用Hash然后查找即可。
#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
typedef long long LL;
const int N = 1005;
const int H = 10007;
struct Point
{
int x,y;
};
Point p[N];
struct Node
{
int x,y;
int next;
};
Node node[N];
int cur,n;
LL ans;
int Hash[H];
void Init()
{
for(int i=0;i<H;i++)
Hash[i] = -1;
cur = ans = 0;
}
void Insert(int x,int y)
{
int h = (x * x + y * y) % H;
node[cur].x = x;
node[cur].y = y;
node[cur].next = Hash[h];
Hash[h] = cur++;
}
bool Search(int x,int y)
{
int h = (x * x + y * y) % H;
int t = Hash[h];
while(t != -1)
{
if(x == node[t].x && y == node[t].y) return true;
t = node[t].next;
}
return false;
}
LL Work()
{
Init();
for(int i=0;i<n;i++)
{
scanf("%d%d",&p[i].x,&p[i].y);
Insert(p[i].x,p[i].y);
}
for(int i=0;i<n;i++)
{
for(int j=i+1;j<n;j++)
{
int x1 = p[i].x - (p[i].y - p[j].y);
int y1 = p[i].y + (p[i].x - p[j].x);
int x2 = p[j].x - (p[i].y - p[j].y);
int y2 = p[j].y + (p[i].x - p[j].x);
if(Search(x1,y1) && Search(x2,y2)) ans++;
}
}
for(int i=0;i<n;i++)
{
for(int j=i+1;j<n;j++)
{
int x1 = p[i].x + (p[i].y - p[j].y);
int y1 = p[i].y - (p[i].x - p[j].x);
int x2 = p[j].x + (p[i].y - p[j].y);
int y2 = p[j].y - (p[i].x - p[j].x);
if(Search(x1,y1) && Search(x2,y2)) ans++;
}
}
ans >>= 2;
return ans;
}
int main()
{
while(~scanf("%d",&n),n)
printf("%I64d\n",Work());
return 0;
}
题目:http://acm.hust.edu.cn/problem.php?id=1623
分析:本题与上题一样,只是注意本题中的点可能重合,所以一定要先去重。
正方形个数(二维点哈希)相关推荐
- 理想的正方形 HAOI2007(二维RMQ)
理想的正方形 省队选拔赛河南 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 大师 Master 题目描述 Description 有一个a*b的整数组成的矩阵,现 ...
- P2216 [HAOI2007]理想的正方形(二维RMQ)
题目描述 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 输入输出格式 输入格式: 第一行为3个整数,分别表示a,b,n的值 第二行至 ...
- P2601 [ZJOI2009]对称的正方形(二维哈希)(二分)
洛谷传送门 文章目录 题目描述 解析 代码 题目描述 解析 做三个hash 分一下正方形边长的奇偶性 然后枚举中心点,二分边长即可 有点类似模拟赛那道红十字的题 我一开始觉得分奇偶好麻烦啊 为什么不直 ...
- bzoj 1414 bzoj 3705: [ZJOI2009]对称的正方形(二维Hash)
1414: [ZJOI2009]对称的正方形 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 727 Solved: 345 [Submit][St ...
- [luoguP2601] [ZJOI2009]对称的正方形(二维Hash + 二分 || Manacher)
传送门 很蒙蔽,不知道怎么搞. 网上看题解有说可以哈希+二分搞,也有的人说用Manacher搞,Manacher是什么鬼?以后再学. 对于这个题,可以从矩阵4个角hash一遍,然后枚举矩阵中的点,再二 ...
- 二维数组:随机生产,遍历,判断两个数组一维二维长度,和内容是否一致
import java.util.Random;/*** 1,定义第一个方法,传入数组长度,返回一个1维和2维长度都完全相同的数组* 2.定义一个方法,传入两个数二维组,判断两个数组是否完全一致:一维 ...
- C语言 二维数组遍历 - C语言零基础入门教程
目录 一.计算一维数组长度 二.计算二维数组长度 1.二维数组行数 2.二维数组列数 3.二维数组的元素个数 = 二维数组行数 * 二维数组列数 三.猜你喜欢 零基础 C/C++ 学习路线推荐 : C ...
- C语言 二维数组行数和列数计算 - C语言零基础入门教程
目录 一.计算一维数组长度 二.计算二维数组长度 1.二维数组行数 2.二维数组列数 3.二维数组的元素个数 = 二维数组行数 * 二维数组列数 三.猜你喜欢 零基础 C/C++ 学习路线推荐 : C ...
- 通通WPF随笔(3)——艺术二维码素材生成器
最近公司让我开发一个条形码的生成控件,花了半天时间搞定觉得不过瘾,什么年代了该用二维码了吧.于是wiki了一下二维码的资料. 比较常见的就是QR码(Quick Response)即快速识别码,为了验证 ...
最新文章
- 《未来企业效率白皮书》
- 前沿科技山雨欲来,四大领域存创新机会
- 北信源IPO,拟筹资开发企业级云安全管理平台
- 据说这是个电子元器件采购的春天,我们该如何把握机遇?
- 一个完整的Web应用程序部署示例
- 广州站 | 云原生 Serverless 技术实践营精彩回顾
- Laravel event 事件的简单使用
- Linux下conda 安装以后 activate无法使用
- 浅谈JAVA工作流的优雅实现方式
- fir低通滤波器c语言,大神教你:FIR与IIR低通滤波器的最简最快实现
- JVM——垃圾回收算法
- 苹果手机有护眼模式吗_暗黑模式=护眼模式?其实手机中的这个设置才真正护眼...
- 【C++ 第五章 个人银行账户管理程序案例】
- java程序 下雨,利用SurfaceView实现下雨与下雪动画效果详解(Kotlin语法)
- Python列表实现矩阵的创建、输入输出、转化转置、加减乘运算并设计一个矩阵计算器GUI界面
- 鸿蒙无法使用安卓应用市场,关于华为鸿蒙兼容安卓应用的原因与思考
- 奇异值分解究竟是个啥,该如何理解
- C语言实现-求m到n之和
- HTML中的<a>标签
- 中国三大港进入全球最高效港口排名前十,新兴市场物流竞争力中国第一,印度和南亚或继续充当西方买家采购替代市场 | 美通社头条...