记录编号 |
294433 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[HZOI 2016]几何 |
最终得分 |
100 |
用户昵称 |
小e |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
4.403 s |
提交时间 |
2016-08-12 06:35:12 |
内存使用 |
0.32 MiB |
显示代码纯文本
//通过简短的证明可以知道,我们得出的k的答案不是4就是-1;
//所以,我们只需要判断正四边形是否出现就可以了,
//然后我们要做的就是(n^2)枚举点对,
//然后通过这两个点,计算出另外两个点的坐标,
//再判断另外两个点是否存在就可以了。
//至于计算另外两个点的坐标,我们可以应用三角形全等的知识求出另外两个点的坐标。
//然后我们把点排序(先x, x相同时y),然后我们二分查找坐标就可以了。
//--Skyminer
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <map>
using namespace std;
int N;
pair <int, int> P[1010];
map <pair <int, int>, bool> ma;
inline int Read()
{
int a = 0, minus = 1;
char ch = getchar();
while(ch < '0' || ch > '9'){
if(ch == '-') minus = -1;
ch = getchar();
}
while(ch >= '0' && ch <='9'){
a = a*10 + ch-'0';
ch = getchar();
}
return a * minus;
}
inline int Abs(const int& a)
{
if(a < 0) return -a;
return a;
}
int main()
{
freopen("geometry.in", "r", stdin); freopen("geometry.out", "w", stdout);
int T = Read();
while(T--){
ma.clear();
N = Read();
for(int i = 1; i <= N; i++){
int x = Read(), y = Read();
P[i] = make_pair(x, y);
ma[P[i]] = 1;
}
//for(int i = 1; i <= N; i++) printf("x:%d y:%d\n", P[i].first, P[i].second);
for(int i = 1; i <= N; i++){
for(int j = i+1; j <= N; j++){
int tx = Abs(P[i].first - P[j].first), ty = Abs(P[i].second - P[j].second);
//横纵坐标的差值, 用全等三角形知识求另外两个点
int firstj = P[j].first, firsti = P[i].first, secondj = P[j].second, secondi = P[i].second;
if((ma.count(make_pair(firstj+ty, secondj+tx))&&ma.count(make_pair(firsti+ty, secondi+tx))) || (ma.count(make_pair(firstj-ty, secondj-tx))&&ma.count(make_pair(firsti-ty, secondi-tx)))){
puts("4");
goto NEXT;
}
}
}
puts("-1");
NEXT:;
}
fclose(stdin); fclose(stdout);
return 0;
}
/*
2
5
1 2
1 0
2 1
0 1
1 1
4
0 1
1 2
2 1
1 1
ans: 4 -1
*/
/*
1 5
-2 1
3 4
-1 5
0 0
2 0
ans: 4
*/