标题:螺旋折线
如图p1.png所示的螺旋折线经过平面上所有整点恰好一次。
对于整点(X, Y),我们定义它到原点的距离dis(X, Y)是从原点到(X, Y)的螺旋折线段的长度。
例如dis(0, 1)=3, dis(-2, -1)=9
给出整点坐标(X, Y),你能计算出dis(X, Y)吗?
【输入格式】
X和Y
对于40%的数据,-1000 <= X, Y <= 1000
对于70%的数据,-100000 <= X, Y <= 100000
对于100%的数据, -1000000000 <= X, Y <= 1000000000
【输出格式】
输出dis(X, Y)
【样例输入】
0 1
【样例输出】
3
题解:将每个外围的第一根折线顺时针旋转90°(不影响结果),可以看出是由一个一个正方形构成的图像,所以只需算出所给点内部包围的所以正方形周长ans1和1所给点在最外层的折线长度ans2即可;
(x,y)点所在的一个正方形的边长的一半为 a=max(abs(x),abs(y))
ans1=8×(1+2+3+...+a-1)=4*a*(a-1)
当x>=0时:
若y>=0,ans2=3a+x+a-y=4a+x-y;
若y<0,ans2=5a-y+a-x=6a-x-y;
当x<0,ans=x-(-a)+y-(-a)=2a+x+y;
#include<iostream>
#include<math.h>
#define ll long long
using namespace std;
int main()
{
ll x,y;
while(~scanf("%lld %lld",&x,&y))
{
ll a=max(abs(x),abs(y));
ll ans2,ans1=4*(a-1)*a;
if(x<0){
ans2=x+y+2*a;
}else{
if(y>=0)
ans2=4*a+x-y;
else
ans2=6*a-x-y;
}
printf("%lld\n",ans1+ans2);
}
return 0;
}