AcWing 1237. (数学)螺旋折线
原题链接
中等
作者:
Avetre
,
2025-04-03 11:38:27
· 湖北
,
所有人可见
,
阅读 2
思路:
分别找到每一条边上的点
走过的距离dis(x,y)
与坐标x,y
的关系,突破点是每个右上角的点(i,i)
,它走过的距离为(2i)^2
实际上,每个左上转折点
对应的dis=2n(2n-1)
,每个左下转折点
对应的dis=(2n-1)(2n-1)
,每个右上转折点
对应的dis=2n*2n
,每个右下转折点
对应的dis=2n(2n+1)
上横(绿)
:4y^2 + (y - x)
下横(红)
:4y^2 + (-2y) + ((-y) - x)
左竖(灰)
:4x^2 + (-2x) + ((-x) - y)
右竖(黄)
:4x^2 + (x - y)

注意:
1.为防止爆int,结果、坐标都用long long int(坐标涉及平方操作)
2.注意负值坐标值来表示矩形某一边长时,要加负号使之为正值
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long int LL;
LL x,y,res;
LL dis(LL x,LL y)
{
if(y > 0 && -y <= x && x <= y) return - (y - x) + 4*y*y;
else if(y <= 0 && y - 1 <= x && x <= -y) return - 2*y - y - x + 4*y*y;
else if(x <= 0 && y > x && y <= -x) return 2*x - (-x - y) + 4*x*x;
else if(x > 0 && y <= x && y >= -x) return x - y + 4*x*x ;
}
int main()
{
cin >> x >> y;
cout << dis(x,y);
return 0;
}