题目链接:https://www.acwing.com/problem/content/1239/
题目
如下图所示的螺旋折线经过平面上所有整点恰好一次。
对于整点 (X,Y),我们定义它到原点的距离 dis(X,Y) 是从原点到 (X,Y) 的螺旋折线段的长度。
例如 dis(0,1)=3,dis(−2,−1)=9
给出整点坐标 (X,Y),你能计算出 dis(X,Y) 吗?
输入格式
包含两个整数 X,Y。
输出格式
输出一个整数,表示 dis(X,Y)。
数据范围
−
1
0
9
≤
X
,
Y
≤
1
0
9
−10^9≤X,Y≤10^9
−109≤X,Y≤109
输入样例:
0 1
输出样例:
3
思路:分类讨论,找出四个角的距离公式(等差数列求和,d=8)
每个象限的点的距离可以由角的距离通过偏移得来
x轴和y轴上的点等差数列直接求和即可得到距离
注:第三象限的点特殊些
AC代码
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
typedef long long LL;
LL x,y,ans;
int main()
{
scanf("%lld%lld",&x,&y);
if(x > 0 && y > 0) // 第一象限
{
LL r = max(x,y),d = 4;
ans += r*4+r*(r-1)*4;
if(x < r) ans -= r-x;
if(y < r) ans += r-y;
}
else if(x < 0 && y > 0) // 第二象限
{
LL r = max(abs(x),y),d = 2;
ans += r*2+r*(r-1)*4;
if(abs(x) < r) ans += r-abs(x);
if(y < r) ans -= r-y;
}
else if(x < 0 && y < 0) // 第三象限
{
ans = 1;
LL r = max(abs(x)-1,abs(y)),d = 8;
ans += r*8+r*(r-1)*4;
if(abs(x)-1 < r) ans -= r-(abs(x)-1);
if(abs(y) < r) ans += r-abs(y);
}
else if(x > 0 && y < 0) // 第四象限
{
LL r = max(x,abs(y)),d = 6;
ans += r*6+r*(r-1)*4;
if(x < r) ans += r-x;
if(abs(y) < r) ans -= r-abs(y);
}
else if(x > 0 && y == 0) // x轴正向
{
LL r = x,d = 5;
ans += r*5+r*(r-1)*4;
}
else if(x < 0 && y == 0) // x轴负向
{
LL r = abs(x),d = 1;
ans += r+r*(r-1)*4;
}
else if(x == 0 && y > 0) // y轴正向
{
LL r = y,d = 3;
ans += r*3+r*(r-1)*4;
}
else if(x == 0 && y < 0) // y轴负向
{
LL r = abs(y),d = 7;
ans += r*7+r*(r-1)*4;
}
printf("%lld\n",ans);
return 0;
}