题目链接:HDU5762
Teacher Bo
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 354 Accepted Submission(s): 199
Problem Description
Teacher BoBo is a geography teacher in the school.One day in his class,he marked
N
points in the map,the
i
-th point is at
(Xi,Yi)
.He wonders,whether there is a tetrad
(A,B,C,D)(A<B,C<D,A≠CorB≠D)
such that the manhattan distance between A and B is equal to the manhattan distance between C and D.
If there exists such tetrad,print "YES",else print "NO".
If there exists such tetrad,print "YES",else print "NO".
Input
First line, an integer
T
. There are
T
test cases.
(T≤50)
In each test case,the first line contains two intergers, N, M, means the number of points and the range of the coordinates. (N,M≤105) .
Next N lines, the i -th line shows the coordinate of the i -th point. (Xi,Yi)(0≤Xi,Yi≤M) .
In each test case,the first line contains two intergers, N, M, means the number of points and the range of the coordinates. (N,M≤105) .
Next N lines, the i -th line shows the coordinate of the i -th point. (Xi,Yi)(0≤Xi,Yi≤M) .
Output
T
lines, each line is "YES" or "NO".
Sample Input
2 3 10 1 1 2 2 3 3 4 10 8 8 2 3 3 3 4 4
Sample Output
YES NO
题意:给出一堆点,问有没有2对点的曼哈顿距离相等。
题目分析:因为明确范围在10w之内,所以可以哈希查重。对于曼哈顿距离这个没有技巧只能一个一个算,立一个flag(雾)统计是否找到了重复的距离,因为就算是10w个点,其坐标也在10w以内,换句话说就是距离只能取0到20w这些整数值,抽屉原理或者其他什么名词,在min(N^2,2*M)次运算内一定能得出结果,所以这题的暴力也不算暴力,一种可行的优化方案是对于N^2>2*M的情况直接输出YES,这样M就能用上了,不过我没有写。
注意flag是减少复杂度的关键,重复发生时一定要把flag立起来(雾)跳过运算,不然就真成O(n^2)TLE了
#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int x[100010],y[100010],vis[300000];
int main()
{
int t,n,m;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
int flag=0;
memset(vis,0,sizeof(vis));
for(int i=0;i<n;i++)
{
scanf("%d%d",&x[i],&y[i]);
if(flag==0)
for(int j=0;j<i;j++)
{
int buf=abs(x[i]-x[j])+abs(y[i]-y[j]);
if(vis[buf]>=1) flag=1;
vis[buf]++;
}
}
if(flag==1) printf("YES\n");
else printf("NO\n");
}
}