#include using namespace std; const int N = 100010; int n; int a1, b1, a2, b2; struct Point { int x, y; int d; bool operator<(const Point &W) const { return d < W.d; } } point[N]; // 利用欧几里得距离,计算两点间的距离平方,也就是半径的平方 int get_dist(int x1, int y1, int x2, int y2) { int dx = x1 - x2; int dy = y1 - y2; return dx * dx + dy * dy; } int main() { scanf("%d%d%d%d", &a1, &b1, &a2, &b2); scanf("%d", &n); for (int i = 0; i < n; i++) { int x, y; scanf("%d%d", &x, &y); point[i] = {x, y, get_dist(x, y, a1, b1)}; // 计算每个导弹到A1拦截系统的距离 } // 按距离由大到小排序 sort(point, point + n); reverse(point, point + n); int res = point[0].d, r = 0; // res初始化为离A1拦截系统最远的导弹距离,r是A2拦截系统的半径,因为如果最远的都归A1系统拦截,那么A2什么也不用拦截,半径为0 for (int i = 0; i < n; i++) { // 枚举每个导弹 r = max(r, get_dist(point[i].x, point[i].y, a2, b2)); // 更新与A2拦截系统的距离,也就是A2系统的半径 res = min(res, point[i + 1].d + r); // 由于是按距离A1拦截系统由大到小排序,所以,point[i+1]意味着把[0~i]的给A2拦截,[i+1,n-1]归A1拦截 } // 注意:这里面i=n-1时,point[i+1].d=point[n-1+1].d=point[n].d,此时point[n].d是0, // point[i + 1].d + r=r,这时的真实场景是把所有导弹都让A2拦截系统拦截,A1一个也不拦截 // 输出答案 printf("%d\n", res); return 0; }