http://acm.hdu.edu.cn/showproblem.php?pid=5762
初看题目范围要吓死我了。。
暴力枚举两点a(x1,y1),b(x2,y2),求出它们的曼哈顿距离|x1-x2|+|y1-y2|,并保存
当一个曼哈顿距离两次被访问,则存在符合题意的四元组
假设一开始计算出来的曼哈顿距离均不相同,那顶多只有2*10^5种可能,当执行第2*10^5+1次操作时,就不会再出现新的距离值。因此求得的曼哈顿距离必定是前2*10^5计算中的一种。
一组数据的时间复杂度 O(min{N^2,M}) .

#include<algorithm> #include<stdio.h> #include<string.h> #include<queue> using namespace std; const int maxn = 105000; const int oo = 0x7fffffff; int v[2*maxn], a[maxn], b[maxn]; int main() { int T, n, m, flag; scanf("%d", &T); while(T--) { flag = 0; memset(v, 0, sizeof(v)); scanf("%d %d", &n, &m); for(int i=1; i<=n; i++) scanf("%d %d", &a[i], &b[i]); for(int i=1; i<=n; i++) { for(int j=i+1; j<=n; j++) { int d = abs(a[i]-a[j])+abs(b[i]-b[j]); if(v[d]) { flag = 1; break; } v[d] = 1; } if(flag) break; } if(flag) printf("YES "); else printf("NO "); } return 0; }