我们在二维平面坐标下要求到(x, y)距离为 sqrt(k) 的点, 我们可以预处理设这个点
为(x1, y1)那么
(
x
−
x
1
)
2
+
(
y
−
y
1
)
2
=
=
k
(x - x1)^2 + (y - y1)^2 == k
(x−x1)2+(y−y1)2==k
令
d
x
=
x
−
x
1
,
d
y
=
y
−
y
1
dx = x - x1, dy = y - y1
dx=x−x1,dy=y−y1
我们只需预处理出所有的
d
x
2
+
d
y
2
=
=
k
dx^2 + dy^2 == k
dx2+dy2==k 的dx 和 dy 和 k 的组合
在查询时就可以按照k的索引变量dx与dy的组合
但是要注意一点, dx和dy我们只能处理出正数结果,也就是x与x1的绝对值
所以要枚举
(
x
+
d
x
,
y
+
d
y
)
,
(
x
−
d
x
,
y
+
d
y
)
,
(
x
+
d
x
,
y
−
d
y
)
,
(
x
−
d
x
,
y
−
d
y
)
(x + dx, y + dy),(x -dx, y + dy),(x + dx, y - dy),(x - dx, y - dy)
(x+dx,y+dy),(x−dx,y+dy),(x+dx,y−dy),(x−dx,y−dy)这四种方案。
预处理 dx, dy
void init()
{
for(int i=0;i<=6000;i++)
{
for(int j=i;j<=6000;j++)
{
int tmp=i*i+j*j;
if(tmp>1e7) break;
v[i*i+j*j].push_back({i,j});
}
}
}
枚举四个方向
for(int j=0;j<4;j++)
{
if(v[k][i].first==0&&d[j][0]==1)
continue;
if(v[k][i].second==0&&d[j][1]==1)
continue;
int xx=x+v[k][i].first*d[j][0];
int yy=y+v[k][i].second*d[j][1];
if(mp.count(xx*10000+yy))
mp[xx*10000+yy]+=w;
}