Problem Description
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".
Input
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).
Output
T
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
问是否有相同的曼哈顿距离,M<=1e5,所以根据抽屉原理就可以知道,如果全部的边数大于2*M-2,那肯定有相同的啊,不然的话就暴力好了
#include<set>
#include<map>
#include<cmath>
#include<stack>
#include<queue>
#include<bitset>
#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<functional>
#define rep(i,j,k) for (int i = j; i <= k; i++)
#define per(i,j,k) for (int i = j; i >= k; i--)
using namespace std;
typedef long long LL;
const int low(int x) { return x&-x; }
const int mod = 1e9 + 7;
const int N = 1e5 + 10;
const int INF = 0x7FFFFFFF;
int T, n, m, f[N * 2];
int x[N], y[N];
int main()
{
scanf("%d", &T);
while (T--)
{
scanf("%d%d", &n, &m);
rep(i, 1, n) scanf("%d%d", &x[i], &y[i]);
if (1LL * n*(n - 1) / 2 > 2 * m) printf("YES\n");
else
{
int flag = 0;
rep(i, 1, 2 * m) f[i] = 0;
rep(i, 1, n)
{
rep(j, i + 1, n)
{
if (f[abs(x[i] - x[j]) + abs(y[i] - y[j])]) flag = 1;
else f[abs(x[i] - x[j]) + abs(y[i] - y[j])] = 1;
if (flag) break;
}
if (flag) break;
}
printf("%s\n", flag ? "YES" : "NO");
}
}
return 0;
}