把define int long long去掉,全改成int就对了。long long会输出一个很大的负数。奇怪
//先来个错误贪心骗分
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int INF=0x3f3f3f3f3f3f3f3f;
int d[100010];//dis1表示每个点到第一个系统的距离的平方,dis2表示每个点到第二个系统的距离的平方
int n,x_1,y_1,x_2,y_2;
int ans=INF;
struct node{
int x,y;
}a[100010];
bool cmp(node a,node b)
{
int f1=(a.x-x_1)*(a.x-x_1)+(a.y-y_1)*(a.y-y_1);
int f2=(b.x-x_1)*(b.x-x_1)+(b.y-y_1)*(b.y-y_1);
return f1<f2;//每个导弹按照距离1系统的距离升序排序
}
signed main()
{
cin>>x_1>>y_1>>x_2>>y_2;
cin>>n;
for(int i=1;i<=n;i++)
{
scanf("%d%d",&a[i].x,&a[i].y);
}
sort(a+1,a+1+n,cmp);
for(int i=n;i>=1;i--)//核心:预处理出1不选的导弹到2的最大值。
{
int dis=(a[i].x-x_2)*(a[i].x-x_2)+(a[i].y-y_2)*(a[i].y-y_2);//按照导弹距离1的距离从远到近枚举,预处理出距离2的距离
d[i]=max(d[i+1],dis);
}
for(int i=1;i<=n;i++)//枚举系统1拦截哪些导弹
{
int res=0;
res+=(a[i].x-x_1)*(a[i].x-x_1)+(a[i].y-y_1)*(a[i].y-y_1);//系统1的半径
res+=d[i+1];//系统2的半径
ans=min(ans,res);
}
cout<<ans;
return 0;
}