哈希 poj 2002
2024-08-26 13:35:07
n个点
求其中有几个正方形
n<1000
暴力4个点就不行了
大概2个点还可以
根基(x*x+y*y)%素数 hash 一下
告诉你2个点求 另外2个点 画个图推一下
重复要/2;
#include<stdio.h>
#include<algorithm>
#include<vector> using namespace std; #define mod 10007
struct point
{
int x,y; }x[]; vector<point>hash[mod]; void insert(int a)
{
int h=(x[a].x*x[a].x+x[a].y*x[a].y)%mod;
hash[h].push_back(x[a]);
}
bool cmp(point a,point b)
{
if(a.x==b.x)
return a.y<b.y;
return a.x<b.x;
}
bool search(int a,int b)
{
int h=(a*a+b*b)%mod;
for(int i=;i<hash[h].size();i++)
{
if(hash[h][i].x==a&&hash[h][i].y==b)
return true;
}
return false;
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF&&n)
{
for(int i=;i<mod;i++)
hash[i].clear(); for(int i=;i<=n;i++)
{
scanf("%d%d",&x[i].x,&x[i].y);
insert(i);
}
int cnt=;
sort(x+,x+n+,cmp);
for(int i=;i<=n;i++)
{
for(int j=i+;j<=n;j++)
{
int x1,y1,x2,y2;
x1=x[i].x-(x[j].y-x[i].y);
y1=x[i].y+(x[j].x-x[i].x);
x2=x[j].x-(x[j].y-x[i].y);
y2=x[j].y+(x[j].x-x[i].x);
if(search(x1,y1)&&search(x2,y2))
cnt++; }
}
printf("%d\n",cnt/);
} return ;
}
最新文章
- powerdesigner,eclipse整合安装
- Thymeleaf+SpringMVC,如何从模板中获取数据
- KlayGE 4.4中渲染的改进(五):OpenGL 4.4和OpenGLES 3
- Android Studio 简单设置
- java微信接口之五—消息分组群发
- ASP.NET MVC(二)
- 作业 for liao
- OC: 数组、集合、字典
- golang语言部分保留字的举例
- 需要知道的开源的框架-IOS
- 你必须掌握的Java基础:JSON解析工具-json-lib
- AXIS2远程调用WebService示例(Eclipse+AXIS)
- mysqlclient和PyMySQL对比
- A Simple Game
- MySql获取所有表名
- CentOS6.5安装图形用户界面
- ubuntu (14.04) 卸载 gnome 系统桌面
- Grid布局20行代码快速生成瀑布流
- Netty核心概念(10)之内存管理
- Eclipse编译快捷键